Взаимодействие посредством 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. }
Вопрос к более опытным коллегам - не получается получить ответ от сервера и записать его в строку. Где я не так сделал?
Какой-то странный код получения данных от сервера у вас. Естественно, оно работать не будет. Если хотите вычитывать всё, то тогда как-то так:
Со строки 39 ;)
Спасибо за подсказку. Завтра попробую.