• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Esp8226 + proxy

DTsurkov

New member
Всем добрый день!

Необходимо посылать get запрос через прокси. Подскажите как это сделать?
Сейчас использую библиотеку ESP8266httpUpdate.h, отправляю данные ESPhttpUpdate.update(_Data), где _Data массив с get запросом вида abc.com/my.php?A=0;

Всё идеально работает в домашней сети без прокси сервера. Сейчас необходимо слать данные с работы, а тут прокси. Без логина, пароля. Просто ip и порт 3128.
 

kab

New member
Всем добрый день!

Необходимо посылать get запрос через прокси. Подскажите как это сделать?
Сейчас использую библиотеку ESP8266httpUpdate.h, отправляю данные ESPhttpUpdate.update(_Data), где _Data массив с get запросом вида abc.com/my.php?A=0;

Всё идеально работает в домашней сети без прокси сервера. Сейчас необходимо слать данные с работы, а тут прокси. Без логина, пароля. Просто ip и порт 3128.
У меня получилось так:
- узнаем свой реальный ip, запустив, например My IP Address - Shows IPv4 & IPv6 | Blacklist IP Check - Hosting Info
- в своем роутере (читайте инструкцию) прописываем трансляцию пакетов с внешнего ip на внутренний. С портами обходитесь, как Вам надо.
- Всё!
 

DTsurkov

New member
У меня получилось так:
- узнаем свой реальный ip, запустив, например My IP Address - Shows IPv4 & IPv6 | Blacklist IP Check - Hosting Info
- в своем роутере (читайте инструкцию) прописываем трансляцию пакетов с внешнего ip на внутренний. С портами обходитесь, как Вам надо.
- Всё!
Не совсем понял... ESP не получает пока что ни бита информации из сети. Ей нужно самой её слать.

То есть стоит ESP, на ней висят датчики. Если что-то произошло, она переходит по ссылке abc.com/my.php?ALERT=1;
И всё.

Просто сейчас она не может перейти по этой ссылке, так как из её сети в мир попасть без прокси нельзя...

Как мне в этом случае может помочь трансляция адресов? Да и нет у меня доступа к роутеру этому...
 

kab

New member
Не совсем понял... ESP не получает пока что ни бита информации из сети. Ей нужно самой её слать.

То есть стоит ESP, на ней висят датчики. Если что-то произошло, она переходит по ссылке abc.com/my.php?ALERT=1;
И всё.

Просто сейчас она не может перейти по этой ссылке, так как из её сети в мир попасть без прокси нельзя...

Как мне в этом случае может помочь трансляция адресов? Да и нет у меня доступа к роутеру этому...
Ну, это еще проще - правда затратнее по деньгам:): берете бутылку приличного коньяка и идёте к сетевому администратору, который и прописывает Ваше устройство в проксю. Как вариант, может Ваш сайт указать в списке разрешённых сайтов...
 

Алексей.

Active member
берете бутылку приличного коньяка и идёте к сетевому администратору
Вы что смеётесь ???
Публичная сеть провайдера, в лучшем случае Вам ответят в колл-центре, с суппортом вообще никто Вас соединять не будет.
ТС задал реальный вопрос, как пройти через прокси, и не только ему приходится решать эти задачи, поверьте.
Просто ip и порт 3128
Обычное явление, какой нибудь сквид используется как http/https прокси сервер.
 
Последнее редактирование:

kab

New member

Алексей.

Active member
kab, Смысл вопроса не меняется, как пройти через http прокси.
Иными словами, в адуине есть клиент для установления tcp соединения через прокси сервер (используя тип прокси http, не socks4/socks4) или нет.
 

NeoroN

Member
Почти также как и к вебсерверу, просто дополнительные команды надо слать
CONNECT
https://curl.haxx.se/rfc/draft-luotonen-web-proxy-tunneling-01.txt
тоесть подключаешься к прокси и там вначале нужно передать и принять данные от прокси, а потом уже общаться с сайтом через это же соединение:
Код:
     CLIENT -> SERVER                        SERVER -> CLIENT
     --------------------------------------  -----------------------------------
     CONNECT home.netscape.com:443 HTTP/1.0
     User-agent: Mozilla/4.0
     <<< empty line >>>
                                             HTTP/1.0 200 Connection established
                                             Proxy-agent: Netscape-Proxy/1.1
                                             <<< empty line >>>
                  <<< data tunneling to both directions begins >>>
     GET / HTTP/1.1
     Host: test.com
     <<< empty line >>>
                                              HTTP/1.1 200 OK
                                               <<< empty line >>>
                                               <h1>Hello!!!</h1><p>this is test.com</p>
 
Последнее редактирование:

Алексей.

Active member
Почти также как и к вебсерверу, просто дополнительные команды надо слать
CONNECT
Осталось проверить, не пользуется ли сервер устаревшей спецификацией рфц-2068, в которой метод коннект отсутствовал, или пользуется актуальной, в которой коннект уж есть :)
Вообщем клиент готовый не нашелся.
 

NeoroN

Member
таких http проксей просто небывает. Тка как эта спецификация для вебсерверв. Если нужно тупо отправить данные и пофиг на ответ - хватит отбычного TCP подключения(библиотеки нафиг), главное не забыть чистить приемеый буфер. Тоесть добавить всего 2 строчки коннект и пустую - даже на агента пофиг.
 

kab

New member
Если нужно тупо отправить данные и пофиг на ответ - хватит отбычного TCP подключения
А теперь, пожалуйста, объясните для "обычных" (ordinary, casual - как угодно... ):
- если всё "тупо", почему же у ТС возникли проблемы? И как их решить?
 

Алексей.

Active member
kab, Я сам решил попробовать тупо соединиться с яндексом вызывая метод CONNECT на прокси сервере squid/3.5.20.
Телнет-ом соединился с ним и набрал строку CONNECT yandex.ru:443 HTTP/1.1 затем ентер затем ^M (в конце строки <CR><LF>) и получил туннель.
Проблем как то и нет.

alex@vb-u16:~$ telnet x.x.x.x 3128
Trying x.x.x.x...
Connected to x.x.x.x.
Escape character is '^]'.
CONNECT yandex.ru:443 HTTP/1.1

HTTP/1.1 200 Connection established
 

kab

New member
тоесть подключаешься к прокси и там вначале нужно передать и принять данные от прокси, а потом уже общаться с сайтом через это же соединение:
@Алексей.@NeoroN
Я правильно ли понял, что суть в этом:
- перед отправкой запроса на требуемый сервер, надо с ESP на адрес прокси отправить строку типа:

CONNECT "с кем надо" HTTP/1.1 затем ентер затем ^M (в конце строки <CR><LF>)
- ответ прокси особо ценной информации не несёт, т. к. установился ли туннель проще проверить послав запрос уже на адрес сервера "с кем надо", который нам нужен.
- это всё работает, если в организации (т. е. на проксе) не установлены ограничения в доступе к внешнему интернету.
 

Алексей.

Active member
ответ прокси особо ценной информации не несёт, т. к. установился ли туннель
Как это не несет, получили "HTTP/1.1 200 Connection established", туннель построен, получили "HTTP/1.1 403 Forbidden", Вам туда нельзя.
Вы не верите что туннель реально построен? Отправьте кривой запрос в построенный туннель и получите 400 уже от Вашего сервера.
alex@vb-u16:~$ telnet x.x.x.x 3128
Trying x.x.x.x...
Connected to x.x.x.x.
Escape character is '^]'.
CONNECT esp8266.ru:443 HTTP/1.1

HTTP/1.1 200 Connection established

GET /test HTTP/1.1

HTTP/1.1 400 Bad Request
Server: nginx
Date: Fri, 01 Dec 2017 08:25:02 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: close

a6
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>nginx</center>
</body>
</html>

0

Connection closed by foreign host.
 

NeoroN

Member
Взять стандартный пример из ардуины
Arduino/WebClient.ino at master · arduino/Arduino · GitHub

Код:
  IPAddress proxy(192,168,0,2);
  if (client.connect(proxy, 3128)) {
    Serial.println("connected to proxy");
    // Comunicate with proxy
    client.println("CONNECT www.google.com:80 HTTP/1.1");
    client.println();
    // Make a HTTP request:
    client.println("GET /search?q=arduino HTTP/1.1");
    client.println("Host: www.google.com");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("connection failed");
  }
}
А вывод в последовательный порт оставить для отладки, если пины не используются(имхо отладить и с компа можно).
 
Последнее редактирование:
  • Like
Реакции: kab

DTsurkov

New member
А вывод в последовательный порт оставить для отладки, если пины не используются(имхо отладить и с компа можно).
Спасибо! Это я понял. А как именно организовать подобный запрос? Ваш пример использует библиотеку для ethernet shield...

Мой код без прокси сейчас такой:
Код:
#include <ESP8266WiFiMulti.h>
#include <ESP8266httpUpdate.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);

ESP8266WiFiMulti WiFiMulti;

String host = "http://abc.ru/my.php";

void setup() {
  
    Serial.begin(115200);
    Serial.println();
    Serial.println("Hi!");
    WiFiMulti.addAP("myWiFi", "myKeyWord");
    ads.begin();
}

void loop() {
  if((WiFiMulti.run() == WL_CONNECTED)) {
    Serial.println("Connection established");
    int16_t adc0, adc1, adc2, adc3;
    adc0 = ads.readADC_SingleEnded(0);//Измеряем напряжение
    adc1 = ads.readADC_SingleEnded(1);//Измеряем напряжение
    adc2 = ads.readADC_SingleEnded(2);//Измеряем напряжение
    adc3 = ads.readADC_SingleEnded(3);//Измеряем напряжение
    adc0 = int(adc0 * 0.1875);
    adc1 = int(adc1 * 0.1875);
    adc2 = int(adc2 * 0.1875);
    adc3 = int(adc3 * 0.1875);
    Serial.print("AIN0: "); Serial.println(adc0);
    Serial.print("AIN1: "); Serial.println(adc1);
    Serial.print("AIN2: "); Serial.println(adc2);
    Serial.print("AIN3: "); Serial.println(adc3);
  
    String Data = String(host+"?A0="+adc0+"&A1="+adc1+"&A2="+adc2+"&A3="+adc3);
    char _Data[Data.length()+1];
    Data.toCharArray(_Data, Data.length()+1);
    //sent data to server
    t_httpUpdate_return ret = ESPhttpUpdate.update(_Data);
    Serial.print("All data has been sent:   ");
    Serial.println(_Data);
  
    delay(3000);
  }
}
 
Последнее редактирование:

DTsurkov

New member
Так понимаю, что конкретный пример с указанием библиотеки никто не даст?
 
Сверху Снизу