Как создать сервер сокетов 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");
}
}
1 ответ
▲ -1
Я учусь использовать библиотеку arduino для работы с сокетами, и я потратил час на то, чтобы выяснить, почему ваш пример не работает для меня, и в итоге я заметил, что у вас одна строка неверна
if (c = '\n' && currentLineIsBlank) {
должно быть:
{ if (c != '\n' && !currentLineIsBlank) {
И у вас по-прежнему возникает ошибка, связанная с отсутствием символа возврата, потому что вы не печатаете его во втором цикле.
Все равно спасибо за ваш вклад.
,
@Ignacio Quijas Rivera
есть ==
и это правильно, @Juraj
Смотрите также:
- Шлюз не работает в Arduino EthernetENC
- Клиент MQTT на Arduino + SIM900
- Удаленная загрузка кода на плату Arduino через интернет
- Использование AysncUDPMessage для ESP32 для отправки строковых данных
- Отправка данных Arduino через Ethernet на сервер PHP.
- Arduino Ethernet shield server и клиент одновременно
- Простая веб-страница с Ethernet-шилдом Arduino на SD-карте
- Есть ли тайм-аут для Ethernet.begin?
Вы подтвердили, что ваш сетевой экран работает?, @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