Периодическое чтение с сервера Arduino
У меня есть Arduino, подключенный к RGB-экрану. Я хочу периодически запрашивать у своего сервера значения RGB. В основном я работал с помощью Ethernet Shield, но получение значения занимает слишком много времени (~ 500 мс). Я действительно хочу очень быстро читать значения с моего сервера в бесконечном цикле.
Можете ли вы дать мне какие-нибудь советы о том, как мне улучшить свой код?
#include <SPI.h>
#include <Ethernet.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
IPAddress server(192,168,1,151);
IPAddress ip(192, 168, 1, 177);
EthernetClient client;
void setup() {
Serial.begin(9600);
while (!Serial) {
; // ждем подключения последовательного порта. Требуется только для Леонардо.
}
// запускаем Ethernet-соединение:
if (Ethernet.begin(mac) == 0) {
Ethernet.begin(mac, ip);
}
delay(1000);
if (client.connect(server, 80)) {
client.println("GET /rgb.php HTTP/1.1");
client.println("Host: 192.168.1.151");
client.println("Connection: close");
client.println();
}
else {
Serial.println("connection failed");
}
}
void loop()
{
if (client.available()) {
char c = client.read();
... read from Server
}
if (!client.connected()) {
client.stop();
if (client.connect(server, 80)) {
client.println("GET /rgb.php HTTP/1.1");
client.println("Host: 192.168.1.151");
client.println("Connection: close");
client.println();
}
}
}
@, 👍0
Обсуждение2 ответа
Вы можете попробовать использовать прямое TCP-соединение (таким образом вы пропустите уровень HTTP), но вам также нужно подготовить небольшой TCP-сервер (на любом удобном для вас языке), который принимает клиентское соединение, отправляет данные, ждет ACK и закрывает соединение.
Я бы начал с этого раздела:
if (client.connect(server, 80)) {
client.println("GET /rgb.php HTTP/1.1");
client.println("Host: 192.168.1.151");
client.println("Connection: close");
client.println();
}
Сколько сообщений отправляет библиотека Arduino Ethernet для этого блока? На самом деле из-за реализации класса Arduino Print и EthernetClient она отправляет 7 сообщений (шутка!). Она не собирает это в одно сообщение/кадр.
Первая оптимизация — это печать одной строки и отправка ее как одного кадра.
#define CR "\r\n"
client.print("GET /rgb.php HTTP/1.1" CR
"Host: 192.168.1.151" CR
"Connection: close" CR
CR);
Ура!
- Как получить HTTPS на Arduino?
- Клиент MQTT на Arduino + SIM900
- Arduino Ethernet Shield при использовании контактов Arduino Mega
- Ethernet nodemcu
- Удаленная загрузка кода на плату Arduino через интернет
- Экран Ethernet не получает IP
- Где я могу найти лучшую схему выводов для платы «Arduino Ethernet»?
- Использование AysncUDPMessage для ESP32 для отправки строковых данных
вы можете использовать протокол mqtt, он поддерживает push-уведомления вместо опроса и намного легче, @Jossef Harush