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

Esp8226 + proxy

NeoroN

Member
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>

Adafruit_ADS1115 ads(0x48);

ESP8266WiFiMulti WiFiMulti;

String host = "abc.ru";
String script = "my.php";
IPAddress proxy(192,168,0,2);
const int proxyPort = 3128;

void Update(String data) {
  WiFiClient client;
  if (client.connect(proxy, proxyPort)) {
    Serial.println("connected to proxy");
    // Comunicate with proxy
    client.print(String(    "CONNECT ")+host+":80 HTTP/1.1\r\n"+
                            "\r\n"+
                            "GET /"+script+data+" HTTP/1.1\r\n"+
                            "Host: "+host+"\r\n"+
                            "Connection: close\r\n"+
                            "\r\n");
    unsigned long timeout = millis();
    while (client.available() == 0) {
      if (millis() - timeout > 5000) {
        Serial.println(">>> Proxy Client Timeout !");
        client.stop();
        return;
      }
    }
    // Read all the lines of the reply from server and print them to Serial
    while(client.available()){
      String line = client.readStringUntil('\r');
      Serial.print(line);
    }
  } else {
    Serial.println("connection to proxy failed");
  }
  client.stop();
}

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("?A0="+adc0+"&A1="+adc1+"&A2="+adc2+"&A3="+adc3);
    Update(Data);
    Serial.println(Data);

    delay(3000);
  }
}
Конечно этот код надо отлаживать, так как прокси я не поднимал и в утройство его не заливал, даже компилить не пробовал - сделал на основе прмера, думаю суть должна быть понятна.
 

Сергей Ш

New member
Здравствуйте все! Возникла похожая задача-отправлять температуру с рабочего помещения на народомон. Тоже проблема с прокси-сервером (172.168.0.45; пароль:01020304). Раз уже нашли решение, поделитесь, как отправить данные на сайт народного мониторинга через прокси-сервер. Думаю это не только мне пригодится. Вам многие будут благодарны!
 

view24

Member
Человек спросил про конкретику, а ему про пиво и орешки. А если серьезно, я тоже заинтересован в ответе. Сначала о библиотеке ESP8266httpUpdate.h
Наверное не все понимают, что она делает. Она берет указанный файл - прошивку, то есть bin и загружает этот bin в esp8266. Что то наподобие OTA.
Файл указывается так:
t_httpUpdate_return ret = ESPhttpUpdate.update("http://server/file.bin");
И все. Прошивка поступает в ESP, ESP перезагружается и работает с новой прошивкой. Достаточно только расположения файла - сайт, директория, имя. Как работает библиотека я не знаю, но работает отлично. Присоединяюсь к автору и повторяю вопрос - как поступать, если вы на предприятии и работаете через proxy squid адрес 10.0.0.3 порт 3128. Может кто знает?
 

Сергей Ш

New member
Добрый день! Получился такой скетч для отправки температуры на сайт народного мониторинга через прокси-сервер, на работе. Чуть-чуть подработал приведенный выше пример, чтобы прокси стал адекватно себя вести. Думаю, сопоставив эти скетчи, сможете сделать, что вам требуется. Всем большая благодарность за проделанный труд.
Код:
// отправка данных на народмон.ру с градусника ds18b20
// 26.01.2019 Собрано из авторского варианта, с добавлением работы с прокси, с форума ESP8266.
//28.01.2019 Реально работает.

#include <ESP8266WiFi.h>
#include <OneWire.h>
#include <DallasTemperature.h>                                                  
#include <Ticker.h>

#include <ESP8266WiFiMulti.h>
#include <Wire.h>
#include <Adafruit_ADS1015.h>
Adafruit_ADS1115 ads(0x48);
ESP8266WiFiMulti WiFiMulti;


OneWire  ds(2);                                                                     // on pin 2 (a 4.7K resistor is necessary)
DallasTemperature sensors(&ds);

Ticker flipper;

//Прокси-сервер в конторе:
IPAddress proxy(192,168,102,62);                                                   //IP адресс Proxy
const int proxyPort = 8008;                                                        //Port Proxy
String script = "my.php";                                                          //
const char* ssid     = "Name WiFi";                                                    //WiFi
const char* password = "Password WiFi";                                                //Пароль WiFi
const char* host = "[URL='http://www.narodmon.ru']www.narodmon.ru[/URL]";                                              //Адрес хоста "Народный мониторинг"
const int httpPort = 8283;

const int interval = 10*60;                                                        // 10 минут

int tm = interval;
int deviceCount = 0;
 
void flip(){
  tm--;
//  Serial.println(tm);                                                            //Вывод в сериал оставшегося времени
}

void setup() {
  Serial.begin(115200);
  delay(10);
  sensors.begin();
  delay(10);
  deviceCount = sensors.getDeviceCount();                                         // узнаем количество подключенных градусников
//  sensors.getAddress(Address18b20, 0);
  sensors.setResolution(10);                                                      // устанавливаем разрешение градусника 9, 10, 11, или 12 bit
  sensors.requestTemperatures();                                                  // забераем температуру с градусника
 
  //Send();                                                                        // при включении отправляем данные. При толчках питания забанят
  flipper.attach(1, flip);                                                       // запускаем таймер
}

/// функция отправляет данные на народмон.ру
void Send() {

     // Подключаемся к wifi
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");                                                         //Пока подключается к WiFi выводятся точки
  }

  Serial.println();                                                            // отправляем в Serial данные о WiFi подключении
  Serial.println("WiFi connected");
  Serial.print("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.print("MAC address: ");
  Serial.println(WiFi.macAddress());
  Serial.println();
 
 // подключаемся к proxy-серверу
  Serial.println("connecting to proxy");
 
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  if (client.connect(proxy, proxyPort)) {
  //client.print(String(    "CONNECT ")+host+":80 HTTP/1.1\r\n"+              
   //                         "\r\n");                                       //Ошибка 400
   client.print(String(    "CONNECT ")+host+":8283 HTTP/1.1\r\n"+"\r\n");    //Проходит соединение на narodmon
   //client.print("CONNECT [URL='http://www.google.com:80']www.google.com:80[/URL] HTTP/1.1\r\n\r\n");               //Для отработки WiFi, чтобы народром не напрягать
 
  client.print("#");
  client.print(WiFi.macAddress());                                           // отправляем МАС нашей ESP8266
  client.print("#");
  client.print("ESP8266");                                                   // название устройства
//  client.print("#");
//  client.print("45.031660#39.004750");                                     // координаты местонахождения датчика
  client.println();

      // в цикле отправляем данные с подключенных градусников.
      for (int i = 0; i <= deviceCount - 1; i++){
      DeviceAddress Address18b20;
      sensors.getAddress(Address18b20, i);
      float temp = sensors.getTempC(Address18b20);
  
      client.print("#");
      for(int i = 0; i < 8; i++) client.print(Address18b20[I], HEX);        // номер 18b20
      client.print("#");
      client.println(temp);
    }
   client.println("##");
   }
 
   else {
   Serial.println("connection to proxy failed");
   return;
   }
 
  delay(10);
  // читаем ответ с и отправляем его в сериал
  // вообще на ответ нужно както реагировать
  Serial.print("Requesting: ");
  while(client.available()){
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }

  client.stop();       //
  Serial.println();
  Serial.println();
  Serial.println("Closing connection");

//  WiFi.disconnect(); // отключаемся от сети 28.01.2019 Не подключается повторно, только первый раз
  Serial.println("Disconnect WiFi.");

 }

void loop() {
 if (tm == 0){                                                        // если таймер отработал
    flipper.detach();                                                 // выключаем                         
    tm = interval;                                                    // сбрасываем переменную таймера
    sensors.requestTemperatures();                                    // забераем температуру с градусника
    delay(10); 
    Send();                                                           // отправляем
    flipper.attach(1, flip);                                          // включаем прерывание по таймеру
  }
 

}
 

Вложения

Последнее редактирование модератором:

Fireforce

New member
Здравствуйте, хочу сделать управление через MQTT. В организации для доступа к Интернет используется прокси.
Обычно для просмотра сайтов, в настройках браузера прописывается его IP и порт.
На основе примеров написал код, но заставить его работать не получается.
Подскажите как правильно сделать.
Код:
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <PubSubClient.h>

ESP8266WiFiMulti WiFiMulti;

IPAddress proxy(192,168,0,5);                                
const int proxyPort = 8080;                                                                                               
const char* ssid     = "Wi-Fi";                                                 
const char* password = "xxxxxxxx";                             

const char *mqtt_server = "postman.cloudmqtt.com";
const int mqtt_port = 14235;
const char *mqtt_user = "zzzzzz";
const char *mqtt_pass = "ffffffff";

const int LED = 2;
int b = 0;

#define BUFFER_SIZE 100

void callback(const MQTT::Publish& pub)
{
  String payload = pub.payload_string();
  if(String(pub.topic()) == "test/led")
  {
  
    String dataSt = String(payload);
    b = dataSt.substring(dataSt.lastIndexOf(',')+1).toInt();
    digitalWrite(LED, b);
    Serial.println(dataSt);
  }
}

void setup() {
  Serial.begin(115200);
  pinMode (2,OUTPUT);
}

WiFiClient wclient;
PubSubClient client(wclient, mqtt_server, mqtt_port);

void loop()
{
if (WiFi.status() != WL_CONNECTED)
{
WiFi.begin(ssid, password);
  if (WiFi.waitForConnectResult() != WL_CONNECTED)
  return;
}
if (WiFi.status() == WL_CONNECTED)
{
  WiFiClient wwclient;
  wwclient.connect(proxy, proxyPort);
    if (!client.connected())
    {
       if (client.connect(MQTT::Connect("esp8266led")
                         .set_auth(mqtt_user, mqtt_pass)))
                         {
                           client.set_callback(callback);
                           client.subscribe("test/led");
                         }
    }
    if (client.connected()){
      client.loop();
    }
}
}
 
Сверху Снизу