Хочу подружить 1С и Ардуино на ESP8266

lean_74
Offline
Зарегистрирован: 22.12.2015

Веб-сервер на 1С я создал на локальной машине, Через браузер отправляю такой запрос:

admin@192.168.56.176/blog_server/hs/data_services/news/get_news

и получаю что хочу на экране:

тут все хорошо, далее на esp8266 пытаюсь получить то же самое:

#include <ESP8266WiFi.h>                  // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>                   // Библиотека для связи с сетевыми хостами (локальными и интернет)

//#include <ArduinoJson.h>                  // Библиотека для разбора JSON


const char* ssid = "POCO X3 Pro";            // Указываем имя WiFi-сети, к которой будет подключаться ESP8266 для доступа в Интернет
const char* password = "888888";    // Указываем пароль для подключения к WiFi-сети

WiFiClient client;                        // Создаём объект для работы с удалёнными хостами

void setup() {
  Serial.begin(115200);                                         // Инициализируем вывод данных на серийный порт со скоростью 9600 бод
  Serial.println("\n\n");
  WiFi.begin(ssid, password);                                 // Соединяемся с WiFi-сетью
  
  while (WiFi.status() != WL_CONNECTED)                       // Пока соединение не установено
    delay(500);                                               //  делаем задержку в пол секунды, пока соединение не установится
    
  while (!TimeAndWeather())                                   // Синхронизируем время микроконтроллера с реальным временем и получаем информацию о погоде
    delay(5000);
}

void loop() {}

bool TimeAndWeather () { 
  if (client.connect("192.168.56.176",80)) {                                   // Если удаётся установить соединение 192.168.56.176 адрес сервера
    
    client.println("GET /blog_server/hs/data_services/news/get_news HTTP/1.1\r\nHost: admin@192.168.56.176/blog_server/hs/data_services/news/get_news \r\nConnection: close\r\n\r\n"); // Отправляем параметры запроса
    
    delay(300);                                                             // Даём серверу время, чтобы обработать запрос

    Serial.println("chitaem dannie");  
  String line2;
  while ( client.available() )
  {
    char c = client.read();
    line2 += c;
  }
    Serial.print("line2= "); 
    Serial.println(line2);

return false;     

  }
}

Методом тыка(т.е проб и ошибок) добился, чтобы сервер мне что-то ответил. В мониторе порта вижу:

chitaem dannie
line2= HTTP/1.1 400 Bad Request
Date: Thu, 06 Jan 2022 13:23:52 GMT
Server: Apache/2.4.41 (Win32)
Content-Length: 347
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
<p>Additionally, a 400 Bad Request
error was encountered while trying to use an ErrorDocument to handle the request.</p>
</body></html>

Как получить то же, что и в браузере? Веб программирование мне тяжко дается...

 

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

400-я ошибка - это означает не верный запрос.

Ошибка 400 значит, что запрос к серверу содержит синтаксическую ошибку

Попробуй так:

bool TimeAndWeather () {
  if (client.connect("192.168.56.176", 80)) {                                  // Если удаётся установить соединение 192.168.56.176 адрес сервера
    client.println("GET /blog_server/hs/data_services/news/get_news HTTP/1.1 \n 
                    Host: 192.168.56.176 \n
                    Connection: close \n"); // Отправляем параметры запроса
    delay(300);                                                             // Даём серверу время, чтобы обработать запрос
    Serial.println("chitaem dannie");
    String line2;
    while ( client.available() ) {
      char c = client.read();
      line2 += c;
    }
    Serial.print("line2= ");
    Serial.println(line2);

    return false;
  }
}

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Если не получится, покажи вывод и ошибку (если поменяется). Но однозначно ошибка в синтаксисе. Написал по памяти, могу и путать.

lean_74
Offline
Зарегистрирован: 22.12.2015

1C требует авторизацию, конструкция admin@192.168.56.176/blog_server/hs/data_services/news/get_news, позволяет из браузера зайти под именем admin, где тут ввести имя пользователя? проверил - ответ такой же:

chitaem dannie
line2= HTTP/1.1 400 Bad Request
Date: Thu, 06 Jan 2022 17:10:57 GMT
Server: Apache/2.4.41 (Win32)
Content-Length: 226
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
</p>
</body></html>

 

rkit
Offline
Зарегистрирован: 23.11.2016

Ну на какой вы все прете писать вручную http запросы? Что за мода такая среди идиотов? Ну что, сложно набрать в яндексе arduino http library и пользоваться готовой вещью?

lean_74
Offline
Зарегистрирован: 22.12.2015

rkit пишет:

Ну на какой вы все прете писать вручную http запросы? Что за мода такая среди идиотов? Ну что, сложно набрать в яндексе arduino http library и пользоваться готовой вещью?

еще бы знать как ей пользоваться... пошел смотреть

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

lean_74 пишет:

1C требует авторизацию

Тогда конструкция должна быть не такой как у вас, а вида:

client.connect("admin:youpassword@192.168.56.176", 80)

Хотя это наврятли 400ю ошибку бы вызвало. Но пароль как вводить то иначе?))

lean_74
Offline
Зарегистрирован: 22.12.2015

rkit пишет:

Ну на какой вы все прете писать вручную http запросы? Что за мода такая среди идиотов? Ну что, сложно набрать в яндексе arduino http library и пользоваться готовой вещью?

пример из библиотеки HTTPclient:

// (c) Copyright 2010-2012 MCQN Ltd.
// Released under Apache License, version 2.0
//
// Simple example to show how to use the HttpClient library
// Get's the web page given at http://<kHostname><kPath> and
// outputs the content to the serial port
// (c) Copyright 2010-2012 MCQN Ltd.
// Выпущено под лицензией Apache, версия 2.0
//
// Простой пример, показывающий, как использовать библиотеку HttpClient
// Получаем веб-страницу, указанную по адресу http://<kHostname><kPath> и
// выводит содержимое на последовательный порт

#include <ESP8266WiFi.h>                  // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>                   // Библиотека для связи с сетевыми хостами (локальными и интернет)

#include <SPI.h>
#include <HttpClient.h>
#include <Ethernet.h>
#include <EthernetClient.h>
const char* ssid = "POCO X3 Pro";            // Указываем имя WiFi-сети, к которой будет подключаться ESP8266 для доступа в Интернет
const char* password = "88888888";    // Указываем пароль для подключения к WiFi-сети

//WiFiClient c;                        // Создаём объект для работы с удалёнными хостами

// This example downloads the URL "http://arduino.cc/"

// Name of the server we want to connect to
// Имя сервера, к которому мы хотим подключиться
const char kHostname[] = "192.168.56.176";
// Path to download (this is the bit after the hostname in the URL
// that you want to download
// Путь для скачивания (это бит после имени хоста в URL
// который вы хотите скачать
const char kPath[] = "/blog_server/hs/data_services/news/get_news";

byte mac[] = { 0xB8, 0x86, 0x87, 0x5C, 0xD2, 0xBD };//‎B8-86-87-5C-D2-BD

// Number of milliseconds to wait without receiving any data before we give up
// Количество миллисекунд ожидания без получения каких-либо данных, прежде чем мы сдадимся
const int kNetworkTimeout = 30*1000;
// Number of milliseconds to wait if no data is available before trying again
// Количество миллисекунд ожидания, если данные недоступны, прежде чем повторить попытку
const int kNetworkDelay = 1000;

void setup()
{
  // initialize serial communications at 9600 bps:
  
//  Serial.begin(9600); 
//
//  while (Ethernet.begin(mac) != 1)
//  {
//    Serial.println("Error getting IP address via DHCP, trying again...");
//    delay(15000);
//  }  
  Serial.begin(115200);                                         // Инициализируем вывод данных на серийный порт со скоростью 9600 бод
  Serial.println("\n\n");
  WiFi.begin(ssid, password);                                 // Соединяемся с WiFi-сетью
  
  while (WiFi.status() != WL_CONNECTED)                       // Пока соединение не установено
    delay(500);                                               //  делаем задержку в пол секунды, пока соединение не установится

}

void loop()
{
  int err =0;
  
//  EthernetClient c;
  WiFiClient c;
  HttpClient http(c);
  
  err = http.get(kHostname, kPath);
  if (err == 0)
  {
    Serial.println("startedRequest ok");

    err = http.responseStatusCode();
    if (err >= 0)
    {
      Serial.print("Got status code: ");
      Serial.println(err);

      // Usually you'd check that the response code is 200 or a
      // similar "success" code (200-299) before carrying on,
      // but we'll print out whatever response we get

      err = http.skipResponseHeaders();
      if (err >= 0)
      {
        int bodyLen = http.contentLength();
        Serial.print("Content length is: ");
        Serial.println(bodyLen);
        Serial.println();
        Serial.println("Body returned follows:");
      
        // Now we've got to the body, so we can print it out
        unsigned long timeoutStart = millis();
        char c;
        // Whilst we haven't timed out & haven't reached the end of the body
        while ( (http.connected() || http.available()) &&
               ((millis() - timeoutStart) < kNetworkTimeout) )
        {
            if (http.available())
            {
                c = http.read();
                // Print out this character
                Serial.print(c);
               
                bodyLen--;
                // We read something, reset the timeout counter
                timeoutStart = millis();
            }
            else
            {
                // We haven't got any data, so let's pause to allow some to
                // arrive
                delay(kNetworkDelay);
            }
        }
      }
      else
      {
        Serial.print("Failed to skip response headers: ");
        Serial.println(err);
      }
    }
    else
    {    
      Serial.print("Getting response failed: ");
      Serial.println(err);
    }
  }
  else
  {
    Serial.print("Connect failed: ");
    Serial.println(err);
  }
  http.stop();

  // And just stop, now that we've tried a download
  while(1);
}

 

так доходит до авторизации: 


startedRequest ok
Got status code: 401
Content length is: 0

Body returned follows:

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Soft WDT reset

>>>stack>>>

 

потом собака срабатывает.

Если в строке 30 заменить на "admin@192.168.56.176" не подключается совсем,а мне авторизация нужна... Как ее добавить?

lean_74
Offline
Зарегистрирован: 22.12.2015

BOOM пишет:

Тогда конструкция должна быть не такой как у вас, а вида:

client.connect("admin:youpassword@192.168.56.176", 80)

Хотя это наврятли 400ю ошибку бы вызвало. Но пароль как вводить то иначе?))

пользователь без пароля, учебная версия 1С, пароли вводить не дает.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

Ну так попробуй

admin:@192.168.56.176

400я ошибка ушла?

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

я так и не понял, вэб сервер на Битриксе?

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

admin:pass@192.168.56.176 - так не прокатит?

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

sadman41 пишет:
admin:pass@192.168.56.176 - так не прокатит?

У него пароль пустой)) 

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

Дак пусть пасс не пишет, двоеточие оставит.

А вообще - такие вещи через фиддлер гоняют для начала, чтобы понять как там авторизация происходит.

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

#9

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

BOOM пишет:

#9


Мелкие буквы с мобилы не видать, проглядел.

lean_74
Offline
Зарегистрирован: 22.12.2015

ua6em пишет:

я так и не понял, вэб сервер на Битриксе?

Apache 2.4

lean_74
Offline
Зарегистрирован: 22.12.2015

BOOM пишет:

sadman41 пишет:
admin:pass@192.168.56.176 - так не прокатит?

У него пароль пустой)) 

Уже и пароль добавил, не работает из под Ардуино, в браузере хром все ок. 

lean_74
Offline
Зарегистрирован: 22.12.2015

sadman41 пишет:
такие вещи через фиддлер гоняют .

Это что за зверь?

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

Уже попытался поковырять билиотеку HttpClient там есть метод 

http.sendBasicAuth(login,Passw); 

по разному пытался его использовать ни фига

// (c) Copyright 2010-2012 MCQN Ltd.
// Released under Apache License, version 2.0
//
// Simple example to show how to use the HttpClient library
// Get's the web page given at http://<kHostname><kPath> and
// outputs the content to the serial port
// (c) Copyright 2010-2012 MCQN Ltd.
// Выпущено под лицензией Apache, версия 2.0
//
// Простой пример, показывающий, как использовать библиотеку HttpClient
// Получаем веб-страницу, указанную по адресу http://<kHostname><kPath> и
// выводит содержимое на последовательный порт

#include <ESP8266WiFi.h>                  // Библиотека для создания Wi-Fi подключения (клиент или точка доступа)
#include <WiFiClient.h>                   // Библиотека для связи с сетевыми хостами (локальными и интернет)

#include <SPI.h>
#include <HttpClient.h>
#include <Ethernet.h>
#include <EthernetClient.h>
const char* ssid = "POCO X3 Pro";            // Указываем имя WiFi-сети, к которой будет подключаться ESP8266 для доступа в Интернет
const char* password = "88888888";    // Указываем пароль для подключения к WiFi-сети

//WiFiClient c;                        // Создаём объект для работы с удалёнными хостами

// This example downloads the URL "http://arduino.cc/"

// Name of the server we want to connect to
// Имя сервера, к которому мы хотим подключиться
const char kHostname[] = "192.168.56.176";
const char login[] = "admin";
const char Passw[] = "123";

 // sendBasicAuth(const char* aUser, const char* aPassword)
//  http.sendBasicAuth(login,Passw);

// Path to download (this is the bit after the hostname in the URL
// that you want to download
// Путь для скачивания (это бит после имени хоста в URL
// который вы хотите скачать
const char kPath[] = "/blog_server/hs/data_services/news/get_news";

byte mac[] = { 0xB8, 0x86, 0x87, 0x5C, 0xD2, 0xBD };//‎B8-86-87-5C-D2-BD

// Number of milliseconds to wait without receiving any data before we give up
// Количество миллисекунд ожидания без получения каких-либо данных, прежде чем мы сдадимся
const int kNetworkTimeout = 300*1000;
// Number of milliseconds to wait if no data is available before trying again
// Количество миллисекунд ожидания, если данные недоступны, прежде чем повторить попытку
const int kNetworkDelay = 3000;

void setup()
{
  // initialize serial communications at 9600 bps:
  
//  Serial.begin(9600); 
//
//  while (Ethernet.begin(mac) != 1)
//  {
//    Serial.println("Error getting IP address via DHCP, trying again...");
//    delay(15000);
//  }  
  Serial.begin(115200);                                         // Инициализируем вывод данных на серийный порт со скоростью 9600 бод
  Serial.println("\n\n");
  WiFi.begin(ssid, password);                                 // Соединяемся с WiFi-сетью
  
  while (WiFi.status() != WL_CONNECTED)                       // Пока соединение не установено
    delay(500);                                               //  делаем задержку в пол секунды, пока соединение не установится

}

void loop()
{
  int err =0;
  
//  EthernetClient c;
  WiFiClient c;
  HttpClient http(c);
 // sendBasicAuth(const char* aUser, const char* aPassword)
http.sendBasicAuth(login,Passw); 
  err = http.get(kHostname, kPath);
//  http.sendBasicAuth(login,Passw);
  if (err == 0)
  {
    Serial.println("startedRequest ok");

    err = http.responseStatusCode();
    if (err >= 0)
    {
      Serial.print("Got status code: ");
      Serial.println(err);

      // Usually you'd check that the response code is 200 or a
      // similar "success" code (200-299) before carrying on,
      // but we'll print out whatever response we get

      err = http.skipResponseHeaders();
      if (err >= 0)
      {
        int bodyLen = http.contentLength();
        Serial.print("Content length is: ");
        Serial.println(bodyLen);
        Serial.println();
        Serial.println("Body returned follows:");
      
        // Now we've got to the body, so we can print it out
        unsigned long timeoutStart = millis();
        char c;
        // Whilst we haven't timed out & haven't reached the end of the body
        while ( (http.connected() || http.available()) &&
               ((millis() - timeoutStart) < kNetworkTimeout) )
        {
            if (http.available())
            {
                c = http.read();
                // Print out this character
                Serial.print(c);
               
                bodyLen--;
                // We read something, reset the timeout counter
                timeoutStart = millis();
            }
            else
            {
                // We haven't got any data, so let's pause to allow some to
                // arrive
                delay(kNetworkDelay);
            }
        }
      }
      else
      {
        Serial.print("Failed to skip response headers: ");
        Serial.println(err);
      }
    }
    else
    {    
      Serial.print("Getting response failed: ");
      Serial.println(err);
    }
  }
  else
  {
    Serial.print("Connect failed: ");
    Serial.println(err);
  }
  http.stop();

  // And just stop, now that we've tried a download
  delay(5000);
}

 

в мониторе:

startedRequest ok
Got status code: 401
Content length is: 0

Body returned follows:

 

 
Авторизация не проходит.
BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018
Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

В примерах другая последовательность:

  HttpClient client = HttpClient(wifi, serverAddress, port);
  client.beginRequest();
  client.get("/secure");
  client.sendBasicAuth("username", "password"); // send the username and password for authentication
  client.endRequest();

 

lean_74
Offline
Зарегистрирован: 22.12.2015

Komandir пишет:

В примерах другая последовательность:

  HttpClient client = HttpClient(wifi, serverAddress, port);
  client.beginRequest();
  client.get("/secure");
  client.sendBasicAuth("username", "password"); // send the username and password for authentication
  client.endRequest();

 

Спасибо, Komandir. Реально помог!

startedRequest ok
Got status code: 200
Content length is: 231

Body returned follows:
[
{
"Период": "20211025004417",
"ВидНовости": "Объявление",
"Заголовок": "1С + Ардуино",
"ТекстНовости": "Пламенный привет Себе Любимому!"
}
]

Вот и подружили )))