Взаимодействие посредством HTTP

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Доброго времени, коллеги.

Пытаюсь реализовать очередную идею "умного дома". Суть такова. Имется частный дом. Подсобные помещения и т.д. Имеется некий пул датчиков, распределенных по территории. Есть потребность использовать информацию с датчиков как для локальных исполнительных устройств, не всегда рядом расположенных, так и для передачи данных в облако для последующего анализа.
Наиболее логичным представляется интеграция всего этого зверинца на базе уже развернутой локальной сети, тем более, что достаточное количество портов в коммутаторах наличествует.
Считывающий блок видится мне в виде нужного типа сенсора, платы Ардуино Про Мини с ethernet-контроллером на базе ENC28J60. Исполнительная часть - Arduino Uno с шилдом на базе W5100.

Для проверки серверной части был написан скетч следующего содержания:



#include "etherShield.h"
#include "ETHER_28J60.h"

static uint8_t mac[6] = {0x54, 0x52, 0x58, 0x13, 0x00, 0x24};   // this just needs to be unique for your network, 
                                                                // so unless you have more than one of these boards
                                                                // connected, you should be fine with this value.
                                                           
static uint8_t ip[4] = {192, 168, 0, 150};                       // the IP address for your board. Check your home hub
                                                                // to find an IP address not in use and pick that
                                                                // this or 10.0.0.15 are likely formats for an address
                                                                // that will work.

static uint16_t port = 80;                                      // Use port 80 - the standard for HTTP

ETHER_28J60 ethernet;

void setup()
{ 
  ethernet.setup(mac, ip, port);
}

void loop()
{
  if (ethernet.serviceRequest())
  {
    ethernet.print("25");
    ethernet.respond();
  }
  delay(100);
}

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

Клиентская часть написана на основе примера, прилагаемого к библиотеке Ethernet.h.

//Подключение переменных
#include "ThingSpeak.h"
#include <SPI.h>
#include <Ethernet.h>

//Конфигурирование Ethernet
byte mac[] = { 0xDE, 0xA4, 0xBE, 0xEF, 0xFE, 0xED};
EthernetClient client;
IPAddress server(192,168,0,150); 

//Декларирование переменных
unsigned long myChannelNumber = ХХХХХ;
const char * myWriteAPIKey = "ХХХХХХ";


void setup() {
  Serial.begin(9600);
  ThingSpeak.begin(client);
  Ethernet.begin(mac);
  Serial.println("Ehternet connecting");
  Serial.println(Ethernet.localIP());
  delay(1000);
  }


void loop() {
   if (client.connect(server, 80)) {
    Serial.println("connected");
    // Make a HTTP request:
    client.println("GET / HTTP/1.1");
    client.println("Host: 192.168.0.150");
    client.println("User-Agent: arduino-ethernet");
    client.println("Connection: close");
    client.println();
  } else {
    // if you didn't get a connection to the server:
    Serial.println("GET connection failed");
  }
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
    client.println("Connection: close");
    client.println();
  }

  // if the server's disconnected, stop the client:
  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();

    // do nothing forevermore:
    while (true);
  }

  // Write to ThingSpeak. There are up to 8 fields in a channel, allowing you to store up to 8 different
  // pieces of information in a channel.  Here, we write to field 1.
  ThingSpeak.writeField(myChannelNumber, 1, 25, myWriteAPIKey);
  delay(20000); // ThingSpeak will only accept updates every 15 seconds.
}

Вопрос к более опытным коллегам - не получается получить ответ от сервера и записать его в строку. Где я не так сделал?

DIYMan
DIYMan аватар
Offline
Зарегистрирован: 23.11.2015

Какой-то странный код получения данных от сервера у вас. Естественно, оно работать не будет. Если хотите вычитывать всё, то тогда как-то так:

while(!client.available()) ; // ждём, пока сервер прочухается

while(client.available()) // вычитываем ответ
{
    char c = client.read();
    Serial.print(c);

  }
client.stop();

Со строки 39 ;)

Кот Баюн
Offline
Зарегистрирован: 05.06.2016

Спасибо за подсказку. Завтра попробую.