Возникли проблемы с подключением к веб-серверу и извлечением данных обратно

У меня есть код arduino, в котором я пытаюсь извлечь информацию из четырех разных мест. Три работают отлично, а на четвертый я не получаю никакого ответа.

Эти две строки идеально работают в браузере, и я получаю правильный ответ данных. http ://10.196.1.163:8086/query?db=Garden&q = SELECT * FROM "Station" WHERE station = 61 ORDER BY DESC LIMIT 1 Или http://10.197.1.57:8086/query?db=Garden&q=SELECT%20*%20FROM%20%22Station%22%20WHERE%20station%20=%2091%20ORDER%20BY%20DESC%20LIMIT%201

{"results":[{"statement_id":0,"series":[{"name":"Station","columns":["time","altitude","humid","moist","press","rainfall","soiltemp","station","temp","type","vbat","winddir","windspeed"],"values":[["2022-01-08T21:13:58Z",1269,29.2,0,28.5,0,0,91,73.4,9,4.32,0,0]]}]}]}

Приведенный ниже код-это то, что я пытаюсь использовать. Кажется, что он устанавливает связь, но ничего не возвращает.

То, что я вижу в консоли:

  19:55:42.024 -> Starting connection to server: 10.196.1.163 InfluxDB Garden DB...
  19:55:42.024 -> connected to server
  19:55:42.024 ->

Следующая строка начинает подключаться к следующему серверу, который отлично возвращает данные JSON. Я предполагал, что у меня возникли проблемы из-за альтернативного порта 8086, к которому я подключался, но я не уверен. Я искал и находил примеры, похожие на то, что я делаю.

Должно быть, я просто что-то упускаю, но не уверен, что именно. Я работал над этим вопросом в течение нескольких месяцев.

void getLocalDataQuery2() {
  Serial.println("\nStarting connection to server: 10.196.1.163 InfluxDB Garden DB...");
  if (client.connect(server2, 8086)) {
    Serial.println("connected to server");
    client.print("GET /query?");
    client.print("db=Garden");
    client.println("&q=SELECT%20*%20FROM%20%22Station%22%20WHERE%20station%20=%2091%20ORDER%20BY%20DESC%20LIMIT%201");
    client.println("Host: 10.196.1.163");
    client.println("Connection: close");
    client.println();
  } else {
    Serial.println("unable to connect");
    while (WiFi.begin(ssid, pass) != WL_CONNECTED) {
      // unsuccessful, retry in 4 seconds
      Serial.print("failed ... ");
      delay(4000);
      Serial.print("retrying ... ");
    }
  }
  String line = "";

  while(client.available())
  {
    line = client.readStringUntil('\n');

    Serial.print("Line : ");
    Serial.println(line);
  }
}

, 👍0


2 ответа


0

Клиент не получает данные сразу после отправки запроса. Таким образом, client.available() сначала возвращает 0, а ваш цикл while пропускается.

readStringUntil - это одна из функций, которая ждет следующего байта до таймаута (по умолчанию 1 секунда). Таким образом, вы можете сначала вызвать readStringUntil, и он будет ждать поступления данных.

Одним из способов было бы заменить цикл while циклом do while, но цикл do while странный, и даже опытные программисты не любят его использовать.

В реальном приложении первая строка HTTP-ответа важна, поскольку она содержит статус ответа. Остальные строки заголовка ответа можно пропустить.

Так почему бы не добавить чтение первой строки перед циклом while? Таким образом, readStringUntil будет ждать ответа и читать первую строку.

  String line = client.readStringUntil('\n');
  line.trim();
  Serial.print("Status line : ");
  Serial.println(line);

  while (client.available())
  {
    line = client.readStringUntil('\n');
    line.trim();
    Serial.print("Line : ");
    Serial.println(line);
  }
,

Я попробовал это предложение и до сих пор не получил никаких данных. Я вижу следующее: 17:04:36.537 -> Запуск подключения к серверу: 10.196.1.163 InfluxDB Garden DB... 17:04:36.582 -> подключено к серверу 17:04:37.558 -> Строка состояния : 17:04:37.558 ->, @rlgjr562


1

Моим решением было настроить веб-сервер с кодом php в контейнере Docker. PHP-код запускал запрос influxdb и отправлял результаты

,