Не получается отправка GET - ошибка 400

Fox123
Offline
Зарегистрирован: 01.11.2020

Прошу помощи, сломал мозг, гугление не помогает.
Отправка из Arduino Nano данных на домашний Linux-сервер GET-запросом. Ethernet Shield, библиотека EtherCard. Фрагменты кода, непосредственно относящиеся к проблеме:

const char website[] PROGMEM="192.168.1.103"; // адрес сервера
char websiteIP[]="192.168.1.103";
byte sensorsUnique[1][8];
int countSensors;
static byte mac[]={0xB8,0xB8,0xB8,0xB8,0xB8,0xB8}; // MAC-адрес устройства

String printAddress(DeviceAddress deviceAddress){
  String str="";
  for (uint8_t i=0; i<8; i++){
    if (deviceAddress[i]<16) str+="0";
    str+=String(deviceAddress[i], HEX);
    }
  return str;
  }

String getTemperature(DeviceAddress deviceAddress){
  return String(sensors.getTempC(deviceAddress), 1);
  }

void sendrequest(){
  String request="?t_amb=";
  request+=bme.readTemperature();
  request+="&h_amb=";
  request+=bme.readHumidity();
  request+="&p_amb=";
  request+=bme.readPressure()/100.0F;
  DeviceAddress *sensorsUnique; // создаём указатель массив для хранения адресов датчиков
  countSensors=sensors.getDeviceCount(); // количество датчиков на шине
  sensorsUnique=new DeviceAddress[countSensors]; // выделяем память в динамическом массиве под количество обнаруженных датчиков
  sensors.requestTemperatures();
  for (int i=0; i<countSensors; i++){
    request+="&";
    sensors.getAddress(sensorsUnique[i], i);
    request+=printAddress(sensorsUnique[i]);
    request+="=";
    request+=String(sensors.getTempCByIndex(i));
    Serial.print(printAddress(sensorsUnique[i])); // эти 3 строки правильно выводят адреса датчиков и их температуры
    Serial.print(F(": "));
    Serial.println(sensors.getTempCByIndex(i));
    }
  Serial.println(request); // правильно выводится собранная строка с переменными и их значениями
  int str_len=request.length()+1; 
  char request_char[str_len];
  request.toCharArray(request_char, str_len);
  ether.browseUrl(PSTR("/receiver.php"), request_char, website, my_callback);
  }

Сервер возвращает ошибку 400 (неверный запрос), в логах сервера вижу следующее:

192.168.1.104 - - [01/Nov/2020:15:29:14 +0200] "GET /receiver.php?t_amb=10.62&h_amb=82.20&p_amb=1004.99&28d6d356b5013cf9=14.\x02\x9e\x01p\x02\x9f \x98" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:30:15 +0200] "GET /receiver.php?t_amb=10.56&h_amb=82.57&p_amb=1005.03&28d6d356b5013cf9=14.75&282b01\x14\x1b\b\xa3\x8a\x02 HTTP/1.0" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:31:16 +0200] "GET /receiver.php?t_amb=10.56&h_amb=82.30&p_amb=1005.01&28d6d356b5013cf9=14.69&282b01\x14\x1b\b\xa3\x8a\x02 HTTP/1.0" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:32:17 +0200] "GET /receiver.php?t_amb=10.60&h_amb=82.39&p_amb=1005.04&28d6d356b5013cf9=14.75&282b\x15`\x14\x1b\b\xa3\x8a\x02 HTTP/1.0" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:33:18 +0200] "GET /receiver.php?t_amb=10.62&h_amb=82.17&p_amb=1005.08&28d6d356b5013cf9=14.7\x9f\x02$ HTTP/1.0" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:34:19 +0200] "GET /receiver.php?t_amb=10.49&h_amb=83.20&p_amb=1005.\x14\x1b\b\xa3\x8a\x02 HTTP/1.0" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:35:19 +0200] "GET /receiver.php?t_amb=10.50&h_amb=83.21&p_amb=1005.06&28d\x14\x1b\b\xa3\x8a\x02 HTTP/1.0" 400 0 "-" "-"
192.168.1.104 - - [01/Nov/2020:15:36:20 +0200] "GET /receiver.php?t_amb=10.48&h_amb=83.54&p_amb=1005.09&28d6d\x14\x1b\b\xa3\x8a\x02 HTTP/1.0" 400 0 "-" "-"

Такое впечатление, что

request.toCharArray(request_char, str_len);

перекодирует строку не полностью, причём каждый раз по-разному.

Что я делаю не так?

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Fox123 пишет:

Что я делаю не так?

 


Не пытаетесь локализовать ошибку, надеясь на доброго дядю.
Закомментируйте лишнее, передавайте 0 параметров, потом 1, затем 2 и так дойдете до корня проблемы.

Fox123
Offline
Зарегистрирован: 01.11.2020

sadman41 пишет:
Не пытаетесь локализовать ошибку, надеясь на доброго дядю.

С чего вы взяли, что я не пытался? Я проделал всё возможное: простой текстовый параметр передаётся, начальный фрагмент строки передаётся, первый и второй адрес датчика передаются, третий и более - нет.
Проверены разные способы сборки String.

Пост написал только после того, как перепробовал всё, что мог придумать или найти в интернете.
Я надеюсь не на «доброго» дядю вроде вас, а на адекватного человека, могущего и желающего помочь.

rkit
Offline
Зарегистрирован: 23.11.2016

sensorsUnique=new DeviceAddress[countSensors];

Кто будет освобождать?

Проверок на ошибки в работе с датчиками нет.

sadman41
Offline
Зарегистрирован: 19.10.2016

Fox123 пишет:

sadman41 пишет:
Не пытаетесь локализовать ошибку, надеясь на доброго дядю.

С чего вы взяли, что я не пытался?


С того, что это ни из чего не следует. Есть кусок исходника, кусок лога и вопрос "что не так?"

Fox123
Offline
Зарегистрирован: 01.11.2020

rkit пишет:

sensorsUnique=new DeviceAddress[countSensors];

Кто будет освобождать?

Пожалуйста будьте так любезны, если вас не затруднит, объяснить, что именно и каким образом нужно освободить.

rkit пишет:

Проверок на ошибки в работе с датчиками нет.

Пока что до этого не добрался - датчики дают правильные показания, и хорошо. Проблема в отправке данных на север. При том что команда

Serial.println(request);

выдаёт в монитор порта абсолютно правильную строку запроса с корректными адресами датчиков:

?t_amb=11.57&h_amb=78.72&p_amb=1006.64&28d6d356b5013cf9=15.44&282b0156b5013c1c=21.19&28672479a20003df=29.94

 

rkit
Offline
Зарегистрирован: 23.11.2016

Прочитай учебник по ключевым словам, которые лепишь в код.

b707
Offline
Зарегистрирован: 26.05.2017

Fox123 пишет:

Пожалуйста будьте так любезны, если вас не затруднит, объяснить, что именно и каким образом нужно освободить.

Ну вы хоть чуть-чуть в учебник языка загляните, прежде чем бездумно копировать непонятные вам строчки. Оператором new вы динамически выделяете память под массив датчиков. И делаете вы это при каждом запросе! А освобождать память кто будет? Вот она и заканчивается и на формирование строчки для запроса ее уже не хватает.

Нафига вообще, кстати, вам понадобился динамический массив для датчиков? У вас что, в ходе программы их число меняется? И зачем вы этот массив разместили в запросе? - я подозреваю, что ответ на все эти вопросы один - так было в примере, откуда вы это все списали. А сами в этом не понимаете НИЧЕГО.

Ну так теперь, вместо того чтоб строить из себя обиженного - попытайтесь сначала разобраться, как работает "ваш" код

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

у меня блок кода отправки выглядит так:
 

// отправляем данные  
  Serial.println("Sending..."); 
  // заголовок
  String url = "/temp/send.php?";
  url += "&tempC0=";
  url += tempC0;
  url += "&tempC1=";
  url += tempC1;
  url += "&tempC2=";
  url += tempC2;
  url += "&macIP=";
  url += WiFi.macAddress();
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  client.stop();
  delay(10);