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 ();
//клиент.стоп();
}
}
@user1778467, 👍0
Обсуждение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
- Разбор HTTP с аутентификацией в Arduino + Ethernet Shield
- Nano не может получить ответ от ENC28J60 Ethernet Shield
- MQTT на nano с Ethernet Shield не работает
- связь между двумя arduino с помощью ENC28J60?
- Ethernet Shield не работает с TFT-экраном
- Ethernet.begin() конфликтует со встроенным светодиодом на Arduino Nano
- Ограничения подключения ко многим ардуино через Ethernet?
- Modbus TCP вместе с MQTT по тому же ethernet
Вероятно, вам следует обратиться к администратору локальной сети. Они будут теми, кто знает, как они блокируют вас. Вы предоставили нам абсолютно нулевую информацию о корпоративной сети, поэтому у нас очень мало шансов помочь вам обойти ее., @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