отправить GET запрос на сайт

akimov_aleks
Offline
Зарегистрирован: 04.04.2013

Ребята помогите все перерыл не могу понять как отправить GET запрос на сайт.

arduino ethernet shield должен отправить на сайт vivi.kz/index.php?t=4

big-vl
Offline
Зарегистрирован: 13.05.2014
  Serial.println("connecting to server...");
  if (client.connect(serverName, 80)) {
    Serial.println("making HTTP request...");
  // Создаем GET HTTP-запрос:
    client.println("GET /index.php?t=4 HTTP/1.1");
    client.println("HOST: vivi.kz");
    client.println();
  }
BlackWarrior
Offline
Зарегистрирован: 07.09.2013
Столкнулся вот с чем: непонимаю как добиться одновременной работы EthernetServer и EthernetClient?
Хочется иметь возможность управлять пинами и считывать их значения как через web-интерфейс, так и через get-запросы. Выходит либо одно, либо другое. Подскажите, пожалуйста, как это сделать и, если можно, покажите простенький скетч.
Используется Arduino Uno + шилд W5100.
#include <DHT.h>
#include <SPI.h>
#include <Ethernet.h>

#define DHTTYPE DHT22
#define DHTPIN 9
DHT dht(DHTPIN, DHTTYPE);
int dhtTemp; int dhtHum; int dhtHIC;

/******************** НАСТРОЙКИ ETHERNET ********************/

byte mac[] = { 0x90, 0xA2, 0xDA, 0x0D, 0x85, 0xD9 };// физический mac адрес
byte ip[] = { 192, 168, 0, 9 };                     // ip в lan
byte subnet[] = { 255, 255, 255, 0 };               // маска подсети
byte gateway[] = { 192, 168, 0, 1 };                // шлюз по умолчанию
EthernetServer server(80);                          // порт сервера


void setup()
{
  Ethernet.begin(mac,ip,gateway,subnet);  // инициализировать Ethernet устройства
  server.begin();                         // начать прослушивание клиентов
  dht.begin();
}

void loop()
{
  dhtCheck();
  generateWebPage ();
}

void dhtCheck() {
  dhtTemp = dht.readTemperature();
  dhtHum = dht.readHumidity();
  dhtHIC = dht.computeHeatIndex(dhtTemp, dhtHum, false);
}

void generateWebPage () {
  EthernetClient client = server.available();    // искать клиента
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println("Connnection: close");
  client.println();
  client.println("<html>");
  client.println("<head>");
  client.println("<title>Lair module</title>");
  client.println("<meta http-equiv=\"refresh\" content=\"15\">");
  client.println("<meta http-equiv='content-type' content='text/html; charset=UTF-8'>");
  client.println("</head>");
  client.println("<body>");
  client.println("<table>");
    client.println("<tr>");
     client.println("<td>");
      client.println("<center>"); client.println("<b>Климат</b>"); client.println("</center>");
     client.println("</td>");
    client.println("</tr>");
    client.println("<tr>");
     client.println("<td>");
      client.println("<b>Температура: </b>"); if (dhtHIC > 0) {client.print("+");} client.print(dhtHIC); client.println("°");
     client.println("</td>");
    client.println("</tr>");
    client.println("<tr>");
     client.println("<td>");
      client.println("<b>Влажность: </b>"); client.print(dhtHum); client.println("%");
     client.println("</td>");
    client.println("</tr>");
  client.println("</table>");
  /*
  client.println("<h2>Observing State Of Switch</h2>");

  client.print("<h2>Switch is:  </2>");

  if (digitalRead(8))
  {
    client.println("<h3>ON</h3>");
  }
  else
  {
    client.println("<h3>OFF</h3>");
  }
  */
  client.println("</body>");
  client.println("</html>");
  delay(1);         // даем время, чтобы принять данные
  client.stop();
}
// http://tehnopage.ru/ethernet-shield-w5100
// http://radioprog.ru/post/109

 

 
 
 
Как сделать, чтоб по-мимо отображения веб-страницы ещё проводилась отправка примерно такого get-запроса:
192.168.0.251/objects/?script=tempupdated&temp=dhtTemp&hum=dhtHum

каждую минуту или при изменении температуры?

 

 

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

костыль с IFRAME не сгодится ?

HTML код будет такой

<iframe src="192.168.0.251/objects/?script=tempupdated&temp=dhtTemp&hum=dhtHum" width="1" height="1">

iframe используется для подгрузки в основной хтмл код еще сторониие страницы сайтов, а так же легко справляется для осылки GET запросов ;)

а так как у вас в коде есть перезагрузка страницы каждые 15 секунд

<meta http-equiv="refresh" content="15">

то и GET запрос из фрейма тоже будет отсылаться с загрузкой вашей страницы

BlackWarrior
Offline
Зарегистрирован: 07.09.2013

О! Спасибо, добрый человек! А как можно в моем скетче создать вторую страницу с именем, к примеру, debug?

Чтоб было 2 страницы -- основная (корневая) и /debug

И, кстати, костыль с IFRAME работает только если страница открыта в браузере. Есть ещё варианты по переодической отправке get-запроса БЕЗ открытия страницы в браузере?

Sanyaba
Sanyaba аватар
Offline
Зарегистрирован: 27.07.2015

BlackWarrior пишет:

О! Спасибо, добрый человек! А как можно в моем скетче создать вторую страницу с именем, к примеру, debug?

Чтоб было 2 страницы -- основная (корневая) и /debug

Дело в том что я не работал еще с ардуино+ethernet и очень смутно имею представление о его работе... жду пару посылок с ethernet шилдами...

BlackWarrior пишет:

И, кстати, костыль с IFRAME работает только если страница открыта в браузере. Есть ещё варианты по переодической отправке get-запроса БЕЗ открытия страницы в браузере?

Для подобных случаев на серверах с осями Linux используется демон cron, но как я понимаю в вашем случае (ардуино и ethernet шилд) тупо ардуина выводит в окно клиента (браузера) HTML код функцией generateWebPage, может все таки получать нужные данные не при помощи GET запроса к ардуино, а непосредственно в коде ардуино прописать выполнение данной операции через определенный промежуток времени?

 

BlackWarrior
Offline
Зарегистрирован: 07.09.2013

Дело в том, что я хочу реализовать связку arduino + свой сервер. Ардуинка мониторит подключенные к ней датчики (температура, влажность, освещенность, движение и т.д.), выполняет какие либо действия при изменении значений датчиков и выводит состояния подключенных сенсоров на свою веб страницу (в примере за это отвечает функция generateWebPage). При этом, ардуинка должна с какой либо переодичностью (к примеру: каждые 3 минуты) или по событию (сработал датчик движения) скидывать значения датчиков на мой сервер.

Также нужно научить Arduino ПРИНИМАТЬ команды (к примеру зажигать или гасить светодиод) от основного сервера.

Установить Arduino Mega Server на Arduino UNO нет возможности. 

p-a-h-a
Offline
Зарегистрирован: 17.01.2019

big-vl, Просто сильно выручил!

Вопрос был как быть когда требуют не в домен отправлять а по адресу http(s)://narodmon.ru/api

bool SendToNarodmon() { // Собственно формирование пакета и отправка.

  // попытка подключения
  if (client.connect("narodmon.ru", 80)) {
    client.println("GET /api/sensorsValues?sensors=54516,54519,51830,51843,52446,54544,57282,4309&uuid=6524911116d2f82d04a711f67154f531&api_key=MyKey HTTP/1.1"); // и отправляем данные
    client.println("HOST:narodmon.ru");
    client.println();
    delay(150);
    while (client.available()) {
      String line = client.readStringUntil('\r'); // если что-то в ответ будет - все в Serial
      Serial.print(line); 
      delay(10);
    }
  } else  { Serial.println("connection failed"); return false; // не удалось;  }
    
  }
}