Более быстрый способ анализа HTTP-ответа в Arduino

Я отправляю HTTP-запрос GET на сервер и получаю обратно следующие данные.

HTTP/1.1 200 
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked
Date: Fri, 16 Nov 2018 16:30:05 GMT
Connection: close

35
{
  "uuid" : "13b29524-7e12-48fb-bbf9-4396aefff45d"
}
0

С помощью следующего кода я получаю информацию заголовка и тело.

void parseResponse() {
  boolean headerEnd = false;
  byte lineCount = 0;
  String line;
  char endOfLine[] = "\r\n";
  while (1) {
    if (client.available()) {
      char inChar = client.read();
      if (!headerEnd && line.endsWith(endOfLine)) {
        // Просто сохраняем первый, а затем заголовки
        if (lineCount == 10) {
          headerEnd = true;
        } else {
          headers[lineCount] = line;
          line = "";
          lineCount++;
        }
      }

      if (line.endsWith("close")) {
        line = "";
        headerEnd = true;
      }

      if (headerEnd && line.endsWith("}")) {
        line.toCharArray(response, sizeof(response));
        client.stop();
        break;
      }

      line += inChar;
    }
  }
}

На анализ уходит 60–70 мс. Есть ли более быстрый способ анализа? Я думаю, что в мире AVR это слишком медленно для такого небольшого количества текста.

, 👍2


1 ответ


Лучший ответ:

3

есть хорошие функции, унаследованные от класса Stream

int parseResponse(char uuid[], int size) {
  if (!client.find("HTTP/1.1")) // пропускаем HTTP/1.1
    return -1;
  int st = client.parseInt(); // анализ кода состояния
  int l = -1;
  if (st == 200 && client.find("\"uuid\" : \"")) {
    int l = client.readBytesUntil('"', uuid, size);
    uuid[l] = 0; // завершаем строку C
  }
  return l;
}
,