Периодическое чтение с сервера 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

Обсуждение

вы можете использовать протокол mqtt, он поддерживает push-уведомления вместо опроса и намного легче, @Jossef Harush


2 ответа


1

Вы можете попробовать использовать прямое TCP-соединение (таким образом вы пропустите уровень HTTP), но вам также нужно подготовить небольшой TCP-сервер (на любом удобном для вас языке), который принимает клиентское соединение, отправляет данные, ждет ACK и закрывает соединение.

,

0

Я бы начал с этого раздела:

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);

Ура!

,