Проверьте, содержит ли ваша переменная tweet
какие-либо символы новой строки (возврат каретки или перевод строки). Например, следующая переменная может вызвать проблемы
String tweet = "Tweet no. 1\r\n";
из-за символов новой строки в конце. Эти символы приведут к обрыву первой строки HTTP-запроса. Т.е. вместо
GET / apps / thingtweet / 1 / statuses / update? Key = api_key & status = Tweet no. 1 HTTP / 1.1 \ r \ n
стало бы
GET / apps / thingtweet / 1 / statuses / update? Key = api_key & status = Tweet no. 1 \ г \ п
и сервер отклонит его с ошибкой 400 (неверный запрос).
С другой стороны
String tweet = "Tweet no. 1";
было бы хорошо.
Если ваши твиты могут содержать такие символы, попробуйте закодировать их, прежде чем передавать их в client.print()
:
tweet.replace("\r", "%0D");
tweet.replace("\n", "%0A");
Использовать имя хоста вместо IP-адреса
Согласно https://uk.mathworks.com/help/thingspeak/writedata.html, соответствующее имя хоста для используемого вами API - api.thingspeak.com
. Используйте это вместо IP-адреса. Это предпочтительно, потому что IP-адрес, на который указывает имя хоста, может регулярно меняться. (Используемый вами IP-адрес даже не является правильным - и, возможно, уже устарел.)
Т.е., изменить
if (client.connect("184.106.153.149", 80)) {
до
if (client.connect("api.thingspeak.com", 80)) {
Конечная точка API
Вы уверены, что используете правильную конечную точку API? Согласно приведенной выше ссылке, похоже, что конечная точка API вам нужна https://api.thingspeak.com/update.json - поэтому вам может потребоваться изменить
client.print("GET /apps/thingtweet/1/statuses/update?key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");
до
client.print("GET /update.json?api_key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");
Проверьте, успешно ли установлено соединение
В настоящее время ваше устройство отправляет HTTP-запрос, если успешно подключается к серверу, но не дает никаких указаний, если соединение не удается! Поэтому добавьте блок else
для обработки этого сценария и уведомите пользователя через последовательную консоль.
if (client.connect("api.thingspeak.com", 80)) {
client.print("GET /apps/thingtweet/1/statuses/update?key=" + API + "&status=" + tweet + " HTTP/1.1\r\n");
// etc.
}
else {
Serial.println("Connection to the server failed!");
}
Проверка ответа сервера
Чтобы проверить ответ от сервера, добавьте следующий блок в ваш основной цикл, который будет печатать ответ сервера через последовательную консоль.
delay(50);
while (client.available()) {
String response_line = client.readString();
Serial.println(response_line);
}
Чтобы уточнить: этот код должен входить в вашу loop()
функцию.
Ответ должен содержать строку состояния - например, HTTP/1.1 200 OK
, если запрос был успешным, или HTTP/1.1 400 Bad Request
, если возникла проблема.
В случае ответа Bad request
полное сообщение, скорее всего, будет содержать больше информации о точной причине, по которой запрос не был выполнен.
HTTP против HTTP
Наконец, вы уверены, что API поддерживает (обычный, незашифрованный) HTTP и HTTP? Если нет, то это может быть вашей проблемой.