Протокол для приема данных по сети.

Тема в разделе "Arduino & Shields", создана пользователем droideka, 5 дек 2018 в 21:59.

  1. droideka

    droideka Нуб

    Добрый вечер, уважаемые корифеи.

    Задача: заставить arduino uno по сети (только локальной) принимать команды (буквы и числа) от сайта (PHP), с возможностью отправки ответа (true или false).
    Поднимать webserver на arduino ради этого дела не целесообразно, смотрел в сторону MQTT - посредник в виде брокера не самый лучший вариант.
    ModBUS и ZigBee не уверен что есть смысл их использовать.
    Пока смотрю в сторону Telnet сервера на arduino.
    Еще, как вариант, работать напрямую по TCP, есть ли смысл?
    Подскажите какие еще варианты возможны?
    P.S. нужно удаленно запустить реле, но только со своего сайта.
     
    Последнее редактирование: 5 дек 2018 в 22:08
  2. что значит "не целесообразно" и чем телнет целесообразнее
     
  3. Airbus

    Airbus Оракул

    Запустить реле?Террорист чтоли?Внимательно наблюдаю
     
    Kamikadze нравится это.
  4. parovoZZ

    parovoZZ Гуру

  5. droideka

    droideka Нуб

    Это мое личное мнение, я поэтому и задаю здесь вопрос. Вы как знающие люди направьте по правильному пути.
     
  6. http-самое простое
    mqtt-самое универсальное
     
    Airbus нравится это.
  7. Airbus

    Airbus Оракул

    И именно на Ардуино?esp8266/32 не?
     
  8. droideka

    droideka Нуб

    К сожалению нет.
     
  9. b707

    b707 Гуру

    А обязательно по сети? - Уно явно слабовата для сетевых протоколов. Может что попроще, типа радиомодулей NRF24 или 433 МГц?
     
  10. Может быть поэтому сетевые протоколы обрабатывает адаптер, а не уно.
     
  11. droideka

    droideka Нуб

    Нет, только локальная сеть, потому что другие модули нет возможности подключить.
     
  12. parovoZZ

    parovoZZ Гуру

  13. droideka

    droideka Нуб

    Простите, видел Ваше сообщение. Но это через чур как-то, я не настолько хорошо разбираюсь. (((
     
  14. droideka

    droideka Нуб

    Господа, я вроде как нащупал решение, на основе 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?
     
  15. ostrov

    ostrov Гуру

    Char и есть байт. Может в виде битов?
     
  16. Andycat

    Andycat Нерд

    а вот я что то не пойму, требования Локальная сеть и Свой сайт, значит рулить своим сайтом можете?.
    что мешает отправить на сайт/сервер http запрос и в зависимости от ответа включить или нет реле?
    если уж боитесь злоумышленников - шифруйте запроси ответ AES
     
  17. droideka

    droideka Нуб

    Согласно описания библиотеки - байт.
     
  18. droideka

    droideka Нуб

    Ну в общем, с горем пополам заработало. Команды принимает и обрабатывает.
    Забыл добавить, все это дело на модуле 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);

      }
    }
     
    Последнее редактирование: 7 дек 2018 в 08:56