Официальный сайт компании Arduino по адресу arduino.cc
Не получается отправка GET - ошибка 400
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Прошу помощи, сломал мозг, гугление не помогает.
Отправка из 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);
перекодирует строку не полностью, причём каждый раз по-разному.
Что я делаю не так?
Что я делаю не так?
Не пытаетесь локализовать ошибку, надеясь на доброго дядю.
Закомментируйте лишнее, передавайте 0 параметров, потом 1, затем 2 и так дойдете до корня проблемы.
С чего вы взяли, что я не пытался? Я проделал всё возможное: простой текстовый параметр передаётся, начальный фрагмент строки передаётся, первый и второй адрес датчика передаются, третий и более - нет.
Проверены разные способы сборки String.
Пост написал только после того, как перепробовал всё, что мог придумать или найти в интернете.
Я надеюсь не на «доброго» дядю вроде вас, а на адекватного человека, могущего и желающего помочь.
sensorsUnique=
new
DeviceAddress[countSensors];
Кто будет освобождать?
Проверок на ошибки в работе с датчиками нет.
С чего вы взяли, что я не пытался?
С того, что это ни из чего не следует. Есть кусок исходника, кусок лога и вопрос "что не так?"
sensorsUnique=
new
DeviceAddress[countSensors];
Кто будет освобождать?
Пожалуйста будьте так любезны, если вас не затруднит, объяснить, что именно и каким образом нужно освободить.
Проверок на ошибки в работе с датчиками нет.
Пока что до этого не добрался - датчики дают правильные показания, и хорошо. Проблема в отправке данных на север. При том что команда
выдаёт в монитор порта абсолютно правильную строку запроса с корректными адресами датчиков:
?t_amb=11.57&h_amb=78.72&p_amb=1006.64&28d6d356b5013cf9=15.44&282b0156b5013c1c=21.19&28672479a20003df=29.94
Прочитай учебник по ключевым словам, которые лепишь в код.
Пожалуйста будьте так любезны, если вас не затруднит, объяснить, что именно и каким образом нужно освободить.
Ну вы хоть чуть-чуть в учебник языка загляните, прежде чем бездумно копировать непонятные вам строчки. Оператором new вы динамически выделяете память под массив датчиков. И делаете вы это при каждом запросе! А освобождать память кто будет? Вот она и заканчивается и на формирование строчки для запроса ее уже не хватает.
Нафига вообще, кстати, вам понадобился динамический массив для датчиков? У вас что, в ходе программы их число меняется? И зачем вы этот массив разместили в запросе? - я подозреваю, что ответ на все эти вопросы один - так было в примере, откуда вы это все списали. А сами в этом не понимаете НИЧЕГО.
Ну так теперь, вместо того чтоб строить из себя обиженного - попытайтесь сначала разобраться, как работает "ваш" код
у меня блок кода отправки выглядит так: