Nano и Ethernet не будут писать в PushingBox в сети на рабочем месте (но будут дома)

У меня есть Nano+ENC28J60, и я использую Pushingbox, который я настроил для записи данных в электронную таблицу GoogleDrive, которая идеально работает дома. Однако, когда я беру его на работу, он больше не работает.

Серийный номер на работе говорит мне, что

  • Подключение к сети Ethernet хорошее;
  • Я также успешно подключаюсь к клиенту.

Однако [править] даже при 5 попытках ответа client.read(); вообще ничего не сообщает. Сериалы

OK connected! Written. Checking response: + + + + + 

Я предполагаю, что это связано с каким-то брандмауэром или другим ограничением, но если я могу установить соединение, этого должно быть достаточно, не так ли?

[править] примечание: я также пытался подключиться к порту 443 вместо порта 80 в случае, если это была проблема с HTTPS - результаты те же]

Как я могу писать в GDrive в своей рабочей сети?

Код [edit#2 изменил client.connect() для 5 попыток и проверку ответа через client.read() для 5 попыток и Serial.print("+ "); каждый раз] :

#include "DHTesp.h"
#include <SPI.h>
#include <UIPEthernet.h>

DHTesp dhtA; DHTesp dhtB;     

const int ledPin =  LED_BUILTIN;
int ledState = LOW;
int interval = 20; // это количество секунд между считываниями (120=2 минуты) ******************************
int numReads = 2;   // Количество чтений между отправкой в Gdocs. ******************************

byte mac[] = {0xAA, 0xF0, 0xDE, 0xDE, 0x06, 0xAF };  // Экран Ethernet MAC-адрес
byte ip[] = { 10, 10, xx, yy };     
char devid [] = "vXXXXXXXXXXXXXXXX";  // идентификатор устройства из Pushingbox

char server[] = "http://api.pushingbox.com";
EthernetClient client;

int c = '\0';

void setup()
{
  Serial.begin(9600);
  Serial.println ();

  Serial.print(F("dB_CoSdataV3.  Establishing..."));
  if (Ethernet.begin(mac) == 0) {
    Serial.println(F("Failed to configure ethernet"));

    //пока (правда); // нет смысла продолжать, так что ничего не делайте навсегда
  }
  else {
    Serial.println(F("Ethernet OK."));
    // напечатать IP-адрес платы/экрана Ethernet:
    Serial.print(F("local IP addy: "));
    Serial.println(Ethernet.localIP());
  }

  // даем Ethernet Shield секунду для инициализации:
  delay(3000);

  Serial.println("____________________________________________");  Serial.println();

  dhtA.setup(3); // датчик А
  dhtB.setup(4); // датчик Б
  //dhtC.setup(7); dhtD.setup(7);

  pinMode(ledPin, OUTPUT);

}

void loop(){

  int Ahumidity = 0;   int Atemperature = 0 ;
  int Bhumidity = 0;   int Btemperature = 0;

  int j = 0;
  for (j = 1; j <= numReads ; j++ ) {
    int p = 0;
    for (p = 1; p <= interval ; p++) {
      delay (1000);
      // если светодиод выключен, включить его и наоборот:
      if (ledState == LOW) {        ledState = HIGH;       }
      else {        ledState = LOW;      }
      Serial.print (F("."));
      digitalWrite(ledPin, ledState);
    }

    Serial.print (" reading: ");
    Ahumidity += 10 * dhtA.getHumidity();  Atemperature += 10 * dhtA.getTemperature();
    Bhumidity += 10 * dhtB.getHumidity();  Btemperature += 10 * dhtB.getTemperature();

    Serial.print (j);     Serial.print (F("/"));     Serial.print (numReads);
    Serial.println();
  }

  Serial.print (F("Show the averaged val.s : "));
  Serial.print(F("\t\tA:")); Serial.print(Atemperature/(numReads)); Serial.print(F("\t")); Serial.print(Ahumidity/(numReads));
  Serial.print  (F("\tB:")); Serial.print(Btemperature/(numReads)); Serial.print(F("\t")); Serial.print(Bhumidity/(numReads));


  // теперь подключимся + запишем в Gdrive..........
  boolean connected;
  int counter1 = 0;
  do {
      connected = client.connect(server, 80);
      if (connected) { break; }
      client.stop();
      delay(1000);
      Serial.println("retry");
      counter1++;
  } while (!connected && counter1 <5);


//------------------
//если (клиент.подключение(сервер, 80)) {

if (connected){
    Serial.println();
    Serial.print(F("OK connected! "));   

      String buf;

      buf += F("GET /pushingbox?devid=");
      buf += String(devid);

      buf += F("&tempA=");  buf += String(Atemperature/numReads);
      buf += F("&tempB=");  buf += String(Btemperature/numReads);
      buf += F("&tempC=0&tempD=0&tempE=0&tempF=0&tempG=0&tempH=0"); // нужны пустые данные

      buf += F("&humidA=");  buf += String (Ahumidity/numReads);
      buf += F("&humidB=");  buf += String (Bhumidity/numReads);
      buf += F("&humidC=0&humidD=0&humidE=0&humidF=0&humidG=0&humidH=0"); //нужны нулевые данные



      buf += F("&submit=Submit");
      buf += F(" HTTP/1.1");
      //client.println(F("Хост: api.pushingbox.com"));
      buf += F("Host: http://api.pushingbox.com"); // пробуем добавить http://...
      buf += F("Connection: close\r\n");
      //клиент.println();

      client.print(buf);
      Serial.print(F(" Written. "));
      delay(1000);   
      int counter2 = 0;
      Serial.print ("Checking response: ");

      do {
          if (client.available()) {
              Serial.print("Y ");
              c = client.read();
              Serial.print((char)c);
          }         
          delay(2000);
          Serial.print("+ ");
          counter2++;
      } while (counter2 < 5);

      Serial.println ();       Serial.println ();
      //клиент.стоп();
  }


}

, 👍0

Обсуждение

Вероятно, вам следует обратиться к администратору локальной сети. Они будут теми, кто знает, как они блокируют вас. Вы предоставили нам абсолютно нулевую информацию о корпоративной сети, поэтому у нас очень мало шансов помочь вам обойти ее., @Delta_G

конечно, спасибо @Delta_G. я рад предоставить любую информацию, которую я могу - какой вопрос я должен задать сетевому администратору?, @user1778467

вы используете статический IP?, @Juraj

Привет @ Juraj, ты имеешь в виду вопрос, который нужно задать: «используем ли мы здесь статический IP-адрес»? если да/нет, что это будет означать для скетча? спасибо, @user1778467

Я спросил, потому что у вас есть byte ip[] = { 10, 10, xx, yy };, но я вижу, что ip не используется, @Juraj

Я думаю, вы неправильно поняли, что я имел в виду. Ваша фундаментальная проблема связана не с кодом Arduino, а с работой сети. Вам нужно попросить сетевых администраторов помочь вам исправить настройки сети, чтобы ваше устройство могло подключиться. Они знают, что они делают, что блокирует вас, чтобы они могли разблокировать вас., @Delta_G

вы не используете available для проверки поступления ответа. read возвращает -1, если ничего не доступно. См. пример WiFiClient о том, как дождаться ответа и скопировать его в Serial Monitor., @Juraj

после следующего редактирования: если сервер вообще не отвечает, соединение блокируется. это какое-то ограничение в сети на работе, @Juraj


1 ответ


1

В вашем коде для HTTP-запроса есть несколько проблем.

После того как вы подключаетесь к HTTP-серверу, он ничего не отправляет, пока не получит ваш запрос. Ваша проверка доступных байтов всегда должна завершаться ошибкой. Удалите часть if (client.available()), включая часть else.

Вы отправляете запрос POST, но указываете все параметры в URL, а в запросе нет тела. Измените его на GET или поместите параметры в тело запроса и используйте «Content-type: application/x-www-form-urlencoded». Не забудьте параметр Content-length.

Вы отправляете запрос очень маленькими частями. Каждый отдельный отпечаток сразу же отправляется по сети. Объедините строки и напечатайте одну или используйте буферизованную печать.

И вы должны прочитать ответ HTTP и проверить статус.

,

некоторое чтение длины содержимого и буферизация https://github.com/jandrassy/StreamLib/blob/master/README.md, @Juraj

Спасибо Юрай. я 1. изменил POST на GET (как и должно было быть :) 2. объединил отдельные операторы client.print в виде строки, и теперь client.print все за один раз. К сожалению, тот же результат :( Вопрос: где/как я могу прочитать ответ HTTP? ура, @user1778467

К вашему сведению, я пробовал char c = client.read (); Серийный.принт (с); после все-в-одном client.print, и я получаю обратный '?', @user1778467

К вашему сведению # 2 я также пробовал, если (client.connect(server, 443) { в случае, если это была проблема HTTPS... дает точно такие же результаты :(, @user1778467

см. пример WebClient, как распечатать ответ. использовать доступный(), @Juraj

Спасибо Юрай. как я уже сказал в комментарии выше, я просто получаю обратный знак '?' на ответ. ничего больше, @user1778467

добавить к коду в вопросе ответ читать, @Juraj

вы не используете available для проверки поступления ответа. read возвращает -1, если ничего не доступно. См. пример WiFiClient о том, как дождаться ответа и скопировать его в Serial Monitor/, @Juraj

код отредактирован, чтобы включить предложения @Juraj. Тот же результат :( Любые идеи отсюда?, @user1778467

если сервер вообще не отвечает, соединение блокируется. это какое-то ограничение в сети на работе, @Juraj

ХОРОШО. Я действительно надеялся избежать ИТ-специалистов, которые просто скажут «НЕТ», потому что им так проще. Извините за вопрос N00B, но будет ли работать WiFi при такой же блокировке?, @user1778467

Порт 80 не принято блокировать, поэтому речь пойдет об известных и временных IP-адресах. на моей работе у нас есть Wi-Fi для гостей, у которого есть доступ в Интернет, но нет доступа к внутренней сети, @Juraj