• Система автоматизации с открытым исходным кодом на базе 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();
    }
}
}
 
Сверху Снизу