#1 2016-12-14 10:55:20

fratl
Учасник
Зареєстрований: 2016-11-13
Повідомлень: 10

POST запрос и ответ W5100 на внешний WEB сервер

Arduino UNO + шилд W5100 + внешний веб сервер

Ардуино постит данные на внешний веб-сервер.
В зависимости от отправленных данных на сервер, сервер, дает разные ответы.

Необходимо ловить ардуиной уникальный ответ от сервера на соответствующий пост и записывать значение в переменную.

Подскажите как словить ответ на пост?
client.read() не срабатывает


#include <Ethernet.h>
#include <SPI.h>
byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };

//можно убрать если в сети есть DHCP сервер:
IPAddress dnServer(8, 8, 8, 8);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress ip(192, 168, 1, 230);

EthernetClient client;
String data;


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

	if (Ethernet.begin(mac) == 0) {
		Serial.println("Failed to configure Ethernet using DHCP"); 
	}
 else {
  Ethernet.begin(mac, ip, dnServer, gateway, subnet); //можно убрать если в сети есть DHCP сервер
  Serial.println("DHCP OK");
  Serial.println(Ethernet.localIP());
  }
 
	data = "";
}

void loop(){

	data = "test=Karumba";

	if (client.connect("192.168.1.125",80)) 
	{
    Serial.println(data);
    
		client.println("POST /index.php HTTP/1.1"); 
		client.println("Host: 192.168.1.125");
		client.println("Content-Type: application/x-www-form-urlencoded"); 
		client.print("Content-Length: "); 
		client.println(data.length()); 
		client.println(); 
		client.print(data); 
	} 
  else
  {
    Serial.println("server connect failed");
  }

//тут ничего не происходит
 if (client.available()) {
   char c = client.read();
   Serial.print("RESPONSE: ");
   Serial.println(c);
 }
 else {
  Serial.println("NG");
  }

	if (client.connected()) { 
		client.stop();
	}

	delay(5000);
}

Остання редакція fratl (2016-12-14 10:59:09)

Неактивний

#2 2016-12-14 11:22:28

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: POST запрос и ответ W5100 на внешний WEB сервер

по логике , добавьте   паузу в течении которой ожидаете данные, раз ничего не происходит

delay(5000);

if (client.available())
{
   char c = client.read();
   Serial.print("RESPONSE: ");
   Serial.println(c);
  }
  else
  {
  Serial.println("NG");
  }
//-----------------

if (client.connected()) {
        client.stop();
    }

что делает client.stop(); ?

Остання редакція NoName (2016-12-14 11:25:44)

Неактивний

#3 2016-12-14 11:59:04

fratl
Учасник
Зареєстрований: 2016-11-13
Повідомлень: 10

Re: POST запрос и ответ W5100 на внешний WEB сервер

NoName пише:

что делает client.stop(); ?

https://www.arduino.cc/en/Reference/ClientStop

Насколько я понимаю посылает по протоколу окончание связи, разрывает коннект.
client.connected() становится фолс, и шилд доступен для подключения к другим серверам.
Читал что одновременно шилд тянет 2-3 подключения к внешним серверам.

Неактивний

#4 2016-12-14 16:21:21

fratl
Учасник
Зареєстрований: 2016-11-13
Повідомлень: 10

Re: POST запрос и ответ W5100 на внешний WEB сервер

NoName пише:

по логике , добавьте   паузу в течении которой ожидаете данные

Задержка реально помогла, спасибо.

+Заменил переменную:
String c = client.readString();

Неактивний

#5 2016-12-14 18:37:38

fratl
Учасник
Зареєстрований: 2016-11-13
Повідомлень: 10

Re: POST запрос и ответ W5100 на внешний WEB сервер

Немного подправил код,

Основная идея: Ардуино постит значения датчиков на веб-сервер, сервер обрабатывает значения и отвечает что делать дальше Ардуине, Ардуино делает. (т.е. мозг = конфа заложенная в веб-сервер, а ардуино = руки)

Условный пример: можно задавать уровень яркости светодиода посредством внесения значения в БД веб-сервера. (далее написать авторизатор для множества ардуин и через одну веб-страничку управлять освещением улиц районов).


1. в data помещаем запрос для POST, переменным присваиваем значения датчиков Ардуины (для примера переменная test = значение 223344)
2. Отправляем пост на WEB сервер
3. Сервер отвечает контентом ОК=1, ищем совпадение в контенте "ОК=1",  выполняем действия Ардуиной (например включаем светодиод)

#include <Ethernet.h>
#include <SPI.h>

byte mac[] = { 0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x01 };
IPAddress dnServer(8, 8, 8, 8);
IPAddress gateway(192, 168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress ip(192, 168, 1, 230);

EthernetClient client;
String data = "";

void setup() 
{ 
   Serial.begin(9600);
   Ethernet.begin(mac, ip, dnServer, gateway, subnet);
}

void loop()
{

	data = "test=223344";

	if (client.connect("192.168.1.125",80)) 
	{   
		client.println("POST /index.php HTTP/1.1"); 
		client.println("Host: 192.168.1.125");
		client.println("Content-Type: application/x-www-form-urlencoded"); 
		client.print("Content-Length: "); 
		client.println(data.length()); 
		client.println(); 
		client.print(data);
	}

delay(1000);

while(client.connected()) 
{
   if(client.available())
   {
      String c = client.readString();   
      if(c.indexOf("OK=1") >0) //indexOf или contains
      {
          //тут условия для выполнения действий Ардуиной, если найдено OK=1
       }
   }
}

client.stop();
delay(5000);

}

Неактивний

#6 2016-12-15 12:15:57

NoName
Customer
З Київ
Зареєстрований: 2014-07-08
Повідомлень: 1,446

Re: POST запрос и ответ W5100 на внешний WEB сервер

добавьте в отправку статус  объекта и шифрование  данных
а зачем соединении  глушить? экономия питания?

управлять освещением улиц районов  нужно  хотя бы аддаптивной нейронной сетью, а то будут всякие шариться  по страничке управления  освещением
забывать включать или выключать.  что частенько наблюдается.  потому никакого ручного управления для города, кроме как аварийного отключения для балансировки сети. все.

а дома,  да, можете поиграться ), успеха

Неактивний

#7 2016-12-16 15:50:31

freeman
Учасник
З  Киев
Зареєстрований: 2014-09-16
Повідомлень: 82

Re: POST запрос и ответ W5100 на внешний WEB сервер

fratl пише:

Arduino UNO + шилд W5100 + внешний веб сервер

Ардуино постит данные на внешний веб-сервер.
В зависимости от отправленных данных на сервер, сервер, дает разные ответы.

Необходимо ловить ардуиной уникальный ответ от сервера на соответствующий пост и записывать значение в переменную.


Берите сразу esp8266 + mqtt, сильно сэкономит время. Я себе недавно управление освещением в квартире сделал по такой схеме. Если сильно захотеть, Mqtt можно и на ардуине, но там дополнительные трудности с созданием шлюза - rf24Gateway кажется так проект называется.

Остання редакція freeman (2016-12-16 15:50:52)

Неактивний

#8 2016-12-18 14:03:05

fratl
Учасник
Зареєстрований: 2016-11-13
Повідомлень: 10

Re: POST запрос и ответ W5100 на внешний WEB сервер

freeman пише:

esp8266 + mqtt

Спасибо! протокол mqtt - уже собранный "велосипед", который я пытаюсь собрать.

Насколько я понял есть готовая библиотека-клиент mqtt для UNO + шилд W5100
https://github.com/mqtt/mqtt.github.io/wiki/software?id=software

Остается собрать простенький сервер-брокер на ПК/виртуалке или raspberryPi.

И что самое приятное что у esp8266 практически такие же возможности что у и UNO+WiFi
при этом цена за распаянный экземпляр ниже.

Минусы (имхо) в том что простые хостинги не предоставляют протокол mqtt, броадкаст режит фаерволл, и при выключении сервера - два клиента не могут общаться между собой. Но все решаемо.

Неактивний

#9 2016-12-19 12:45:40

freeman
Учасник
З  Киев
Зареєстрований: 2014-09-16
Повідомлень: 82

Re: POST запрос и ответ W5100 на внешний WEB сервер

fratl пише:
freeman пише:

esp8266 + mqtt

Спасибо! протокол mqtt - уже собранный "велосипед", который я пытаюсь собрать.

Насколько я понял есть готовая библиотека-клиент mqtt для UNO + шилд W5100
https://github.com/mqtt/mqtt.github.io/wiki/software?id=software

Остается собрать простенький сервер-брокер на ПК/виртуалке или raspberryPi.

И что самое приятное что у esp8266 практически такие же возможности что у и UNO+WiFi
при этом цена за распаянный экземпляр ниже.

Минусы (имхо) в том что простые хостинги не предоставляют протокол mqtt, броадкаст режит фаерволл, и при выключении сервера - два клиента не могут общаться между собой. Но все решаемо.

Велосипед это если переизобретать заново колесо)))
mqtt - протокол, библиотеки для подключения к mqtt есть в том числе и под arduino IDE.
Куча сервисов в сети, которые дают доступ к своему mqtt бесплатно (sparkfun, adafruit и прочие). Я для себя настроил за 10 минут собственный mqtt-сервер на малине smile
Насчет esp8266 да, он намного выгоднее uno + wifi shield, разница по цене в раз в 10 точно.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму