Взаимодействие посредством HTTP
- Войдите на сайт для отправки комментариев
Доброго времени, коллеги.
Пытаюсь реализовать очередную идею "умного дома". Суть такова. Имется частный дом. Подсобные помещения и т.д. Имеется некий пул датчиков, распределенных по территории. Есть потребность использовать информацию с датчиков как для локальных исполнительных устройств, не всегда рядом расположенных, так и для передачи данных в облако для последующего анализа.
Наиболее логичным представляется интеграция всего этого зверинца на базе уже развернутой локальной сети, тем более, что достаточное количество портов в коммутаторах наличествует.
Считывающий блок видится мне в виде нужного типа сенсора, платы Ардуино Про Мини с 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.
}
Вопрос к более опытным коллегам - не получается получить ответ от сервера и записать его в строку. Где я не так сделал?
Какой-то странный код получения данных от сервера у вас. Естественно, оно работать не будет. Если хотите вычитывать всё, то тогда как-то так:
while(!client.available()) ; // ждём, пока сервер прочухается while(client.available()) // вычитываем ответ { char c = client.read(); Serial.print(c); } client.stop();Со строки 39 ;)
Спасибо за подсказку. Завтра попробую.