Добрый вечер, уважаемые корифеи. Задача: заставить arduino uno по сети (только локальной) принимать команды (буквы и числа) от сайта (PHP), с возможностью отправки ответа (true или false). Поднимать webserver на arduino ради этого дела не целесообразно, смотрел в сторону MQTT - посредник в виде брокера не самый лучший вариант. ModBUS и ZigBee не уверен что есть смысл их использовать. Пока смотрю в сторону Telnet сервера на arduino. Еще, как вариант, работать напрямую по TCP, есть ли смысл? Подскажите какие еще варианты возможны? P.S. нужно удаленно запустить реле, но только со своего сайта.
Это мое личное мнение, я поэтому и задаю здесь вопрос. Вы как знающие люди направьте по правильному пути.
А обязательно по сети? - Уно явно слабовата для сетевых протоколов. Может что попроще, типа радиомодулей NRF24 или 433 МГц?
Господа, я вроде как нащупал решение, на основе TCP сервера. Слушаем порт, принимаем команды, отдаем ответ. Но не могу разобраться с чтение данных, вижу что данные приходят. Код (C++): #include <UIPEthernet.h> byte mac[] = {0x74, 0x69, 0x69, 0x2D, 0x30, 0x31}; EthernetServer server(2000); // создаем сервер, порт 2000 EthernetClient client; // объект клиент boolean clientAlreadyConnected = false; // признак клиент уже подключен char chr; void setup() { Serial.begin(9600); if (Ethernet.begin(mac) == 0) { // ошибка получения IP-адреса Serial.println("no DHCP"); } else { Serial.println(Ethernet.localIP()); //ip Serial.println(Ethernet.subnetMask()); //netmask Serial.println(Ethernet.gatewayIP()); //gateway Serial.println(Ethernet.dnsServerIP()); //dns server server.begin(); } } void loop() { client = server.available(); // ожидаем объект клиент if (client) { // есть данные от клиента if (clientAlreadyConnected == false) { // сообщение о подключении Serial.println("Client connected"); client.println("Server ready"); // ответ клиенту clientAlreadyConnected = true; } while (client.available() > 0) { char chr = client.read(); // чтение символа //chr.replace("\n",""); //server.write(chr); // передача клиенту if (chr == "1") { //тут и server.write("ok"); //вот тут ничего не происходит. Serial.print(chr); } Serial.write(chr); } } } Я так понимаю, данные приходят в виде байтов, мне нужно их собрать воедино и засунуть в переменную типа char?
а вот я что то не пойму, требования Локальная сеть и Свой сайт, значит рулить своим сайтом можете?. что мешает отправить на сайт/сервер http запрос и в зависимости от ответа включить или нет реле? если уж боитесь злоумышленников - шифруйте запроси ответ AES
Ну в общем, с горем пополам заработало. Команды принимает и обрабатывает. Забыл добавить, все это дело на модуле enc28j60. Код (C++): #include <UIPEthernet.h> byte mac[] = {0x74, 0x69, 0x69, 0x2D, 0x30, 0x31}; EthernetServer server(2000); // создаем сервер, порт 2000 EthernetClient client; // объект клиент boolean clientAlreadyConnected = false; // признак клиент уже подключен char chr; String var = ""; void setup() { Serial.begin(9600); if (Ethernet.begin(mac) == 0) { // ошибка получения IP-адреса Serial.println("no DHCP"); } else { Serial.println(Ethernet.localIP()); //ip Serial.println(Ethernet.subnetMask()); //netmask Serial.println(Ethernet.gatewayIP()); //gateway Serial.println(Ethernet.dnsServerIP()); //dns server server.begin(); } } void loop() { client = server.available(); // ожидаем объект клиент if (client) { // есть данные от клиента if (clientAlreadyConnected == false) { // сообщение о подключении Serial.println("Client connected"); client.println("Server ready"); // ответ клиенту clientAlreadyConnected = true; } while (client.available() > 0) { char chr = client.read(); // чтение символа var += chr; server.write(chr); Serial.println(chr); } if (var == "test") { Serial.print("command ok: "); Serial.println(var); } Serial.print("var: "); Serial.println(var); } }