Ви не увійшли.
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-сервер на малине
Насчет esp8266 да, он намного выгоднее uno + wifi shield, разница по цене в раз в 10 точно.
esp8266 + mqtt
Спасибо! протокол mqtt - уже собранный "велосипед", который я пытаюсь собрать.
Насколько я понял есть готовая библиотека-клиент mqtt для UNO + шилд W5100
https://github.com/mqtt/mqtt.github.io/wiki/software?id=software
Остается собрать простенький сервер-брокер на ПК/виртуалке или raspberryPi.
И что самое приятное что у esp8266 практически такие же возможности что у и UNO+WiFi
при этом цена за распаянный экземпляр ниже.
Минусы (имхо) в том что простые хостинги не предоставляют протокол mqtt, броадкаст режит фаерволл, и при выключении сервера - два клиента не могут общаться между собой. Но все решаемо.
Arduino UNO + шилд W5100 + внешний веб сервер
Ардуино постит данные на внешний веб-сервер.
В зависимости от отправленных данных на сервер, сервер, дает разные ответы.Необходимо ловить ардуиной уникальный ответ от сервера на соответствующий пост и записывать значение в переменную.
Берите сразу esp8266 + mqtt, сильно сэкономит время. Я себе недавно управление освещением в квартире сделал по такой схеме. Если сильно захотеть, Mqtt можно и на ардуине, но там дополнительные трудности с созданием шлюза - rf24Gateway кажется так проект называется.
добавьте в отправку статус объекта и шифрование данных
а зачем соединении глушить? экономия питания?
управлять освещением улиц районов нужно хотя бы аддаптивной нейронной сетью, а то будут всякие шариться по страничке управления освещением
забывать включать или выключать. что частенько наблюдается. потому никакого ручного управления для города, кроме как аварийного отключения для балансировки сети. все.
а дома, да, можете поиграться ), успеха
Немного подправил код,
Основная идея: Ардуино постит значения датчиков на веб-сервер, сервер обрабатывает значения и отвечает что делать дальше Ардуине, Ардуино делает. (т.е. мозг = конфа заложенная в веб-сервер, а ардуино = руки)
Условный пример: можно задавать уровень яркости светодиода посредством внесения значения в БД веб-сервера. (далее написать авторизатор для множества ардуин и через одну веб-страничку управлять освещением улиц районов).
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);
}
по логике , добавьте паузу в течении которой ожидаете данные
Задержка реально помогла, спасибо.
+Заменил переменную:
String c = client.readString();
что делает client.stop(); ?
https://www.arduino.cc/en/Reference/ClientStop
Насколько я понимаю посылает по протоколу окончание связи, разрывает коннект.
client.connected() становится фолс, и шилд доступен для подключения к другим серверам.
Читал что одновременно шилд тянет 2-3 подключения к внешним серверам.
по логике , добавьте паузу в течении которой ожидаете данные, раз ничего не происходит
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(); ?
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);
}