Возникли проблемы с подключением к веб-серверу и извлечением данных обратно
У меня есть код 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);
}
}
@rlgjr562, 👍0
2 ответа
Клиент не получает данные сразу после отправки запроса. Таким образом, 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);
}
Моим решением было настроить веб-сервер с кодом php в контейнере Docker. PHP-код запускал запрос influxdb и отправлял результаты
- Не удается успешно реализовать синглтон
- Как объявить массив переменного размера (глобально)
- Программирование Arduino с использованием Python, а не C/C ++
- Загрузка Arduino Nano дает ошибку: avrdude: stk500_recv(): programmer is not responding
- Как справиться с rollover millis()?
- Является ли использование malloc() и free() действительно плохой идеей для Arduino?
- Можно ли сделать несколько функций loop() с помощью Arduino Uno?
- Какие накладные расходы и другие соображения существуют при использовании структуры по сравнению с классом?
Я попробовал это предложение и до сих пор не получил никаких данных. Я вижу следующее: 17:04:36.537 -> Запуск подключения к серверу: 10.196.1.163 InfluxDB Garden DB... 17:04:36.582 -> подключено к серверу 17:04:37.558 -> Строка состояния : 17:04:37.558 ->, @rlgjr562