Как создать сервер сокетов Arduino для получения сообщений

Из Linux я могу отправить сообщение через сокет, используя netcat

echo "Hello" | nc 88.109.110.161 100

Но я не знаю, как настроить сервер сокетов для прослушивания входящих сообщений с помощью экрана Ethernet.

То, что у меня есть, — это один из множества примеров, которые я пробовал, но все еще ничего не показывает

#include <SPI.h>
#include <Ethernet.h>

byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };

EthernetServer server(1000);

void setup() {
  Ethernet.begin(mac);
  Serial.begin(9600);
// Проверяем наличие оборудования Ethernet
  if (Ethernet.hardwareStatus() == EthernetNoHardware) {
    Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    while (true) {
      delay(1); // ничего не делать, нет смысла работать без оборудования Ethernet
    }
  }
  if (Ethernet.linkStatus() == LinkOFF) {
    Serial.println("Ethernet cable is not connected.");
  }

  // запускаем сервер
  server.begin();
  Serial.print("server is at ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  // прослушивание входящих клиентов
 EthernetClient client = server.available();
 if (client) {
   Serial.println("Client");
   // HTTP-запрос заканчивается пустой строкой
   boolean currentLineIsBlank = true;
   while (client.connected()) {
     while(client.available()) {
       char c = client.read();
       // если вы дошли до конца строки (получили перевод строки
       // символ) и строка пуста, HTTP-запрос завершился,
       // чтобы вы могли отправить ответ
       if (c == '\n' && currentLineIsBlank) {

// Здесь находятся данные POST.
         while(client.available())
         {
            Serial.write(client.read());
            //Serial.println(c);
         }
         Serial.println();

         Serial.println("Sending response");
         // отправляем стандартный HTTP-заголовок ответа
         //client.println("HTTP/1.0 200 OK");
         //client.println("Тип контента: текст/html");
         //клиент.println();
         client.println("OK");
         client.stop();
       }
       else if (c == '\n') {
         // вы начинаете новую строку
         currentLineIsBlank = true;
       }
       else if (c != '\r') {
         // вы получили символ в текущей строке
         currentLineIsBlank = false;
       }
     }
   }
   Serial.println("Disconnected");
 }
} 

, 👍0

Обсуждение

Вы подтвердили, что ваш сетевой экран работает?, @jsotola

см. пример ChatServer, @Juraj

Где находится ваш `Ethernet.begin`? Наверняка вам все еще нужен один из них. взгляните на `setup()` в документации здесь: [Пример EthernetServer](https://www.arduino.cc/en/Reference/EthernetServer), @GMc

щит полностью функционален, я могу получать HTTP-запросы, вот как я это понимаю, но мне все еще нужен сервер сокетов, просто чтобы получать необработанные сообщения, @Martin Ocando Corleone

Я обновил код, вот как на самом деле принимает http запросы, @Martin Ocando Corleone

Что вы подразумеваете под «необходимостью сервера сокетов» и «для получения необработанного запроса»? Я бы подумал, что вы уже делаете это. В конце концов, ваш цикл считывает входящие данные сокета посимвольно и собирает их в строку. Вы имеете дело с протоколом http низкого уровня (в приведенном выше примере), проверяя новые строки. Насколько ниже вам «нужно» опуститься?, @GMc

Возможно, опечатка, но вы отправляете свое сообщение на порт 100, а Arduino слушает порт 1000;), @Bouc


1 ответ


-1

Я учусь использовать библиотеку arduino для работы с сокетами, и я потратил час на то, чтобы выяснить, почему ваш пример не работает для меня, и в итоге я заметил, что у вас одна строка неверна

if (c = '\n' && currentLineIsBlank) {

должно быть:

{ if (c != '\n' && !currentLineIsBlank) {

И у вас по-прежнему возникает ошибка, связанная с отсутствием символа возврата, потому что вы не печатаете его во втором цикле.

Все равно спасибо за ваш вклад.

,

есть == и это правильно, @Juraj