Я пытаюсь написать код для платы Arduino Uno WiFi Rev2.В частности, я хотел бы отправить некоторые данные, используя HTTP-запрос POST, в конечную точку API, которую я написал.Я проверил эту конечную точку с Почтальоном, и она отлично работает.Однако, когда я пытаюсь отправить свои данные с помощью библиотеки WiFiNina (https://www.arduino.cc/en/Reference/WiFiNINA),, запрос никогда не достигает моей конечной точки.
Мой скриншот Arduino состоит из двух файлов. Первый - мой «основной» файлкоторая служит точкой входа для моего кода и имеет дело с большей частью функциональности моего кода. В этом файле я настраиваю WiFiClient, как указано в документации Arduino:
#define URL "myappdomain.azurewebsites.net"
...
WiFiClient client;
int status = WL_IDLE_STATUS;
...
void setup(){
...
status = WiFi.begin(WifiSSID, WifiPassword);
while (WiFi.status() != WL_CONNECTED) { //Wait for the WiFI connection completion
delay(500);
Serial.println("Waiting for connection");
}
...
}
...
void loop(){
...
String requestBody =
"{\n \"clientReadings\": {\n \"sensorA\": [],\n \"sensorB\": []\n },\n \"deviceId\": 1,\n \"millilitersConsumed\" : 999\n}";
//send the request
postData(requestBody);
...
}
Во втором моем файле, вот часть моегокод, который обрабатывает этот запрос API:
void postData(String body){
if(WiFi.status()== WL_CONNECTED){ //Check WiFi connection status
if (client.connect(URL, 80)){
client.println("POST /api/PGWC HTTP/1.1");
client.print("Host: ");
client.println(URL);
client.println("Content-type: application/json");
client.println("Accept: */*");
client.println("Cache-Control: no-cache");
client.print("Host: ");
client.println(URL);
client.println("Accept-Encoding: gzip, deflate");
client.print("Content-Length: ");
client.println(body.length());
client.println("Connection: close");
client.println();
client.println(body);
}else{
Serial.println("Error connecting to server");
}
}
}
Я структурировал этот запрос на основе примеров и документации, которые я нашел в Интернете для библиотеки WiFiNina. (Вот один пример: https://www.arduino.cc/en/Reference/WiFiNINAClient). Заголовокинформация и тело основаны на запросах, которые я отправил через Почтальон, поэтому я считаю, что содержание моего запроса является точным. Я считаю, что могу подключиться к серверу через линию "client.connect", потому что яЯ никогда не видел сообщение об ошибке, напечатанное на мониторе Serial, но я видел, что Serial Monitor отображает содержимое "Serial.println"заявления, которые я поместил до моих заявлений "client.println".Тем не менее приложение-функция Azure, в котором размещаются конечные точки API, не показывает никаких признаков попадания в конечную точку API.Когда я отправляю эти же данные в Postman, приложение-функция прекрасно регистрирует соединение.
Когда я пытаюсь распечатать содержимое body, URL и body.length () на последовательном мониторе из postDataфункция, все выглядит так, как ожидалось.Кроме того, я пробовал разные варианты в строке «Соединение: закрыть», но безрезультатно.
Для справки, вот содержимое, которое Почтальон сообщает мне, что отправляет, когда оно успешно достигает конечной точки API.Я также попробовал порт 443. Он прекрасно работает в Почтальоне, но, опять же, не в Arduino.
Host: myappdomain.azurewebsites.net:80
Content-Type: application/json
User-Agent: PostmanRuntime/7.17.1
Accept: */*
Cache-Control: no-cache
Postman-Token: [some UUID, some other UUID]
Host: myappdomain.azurewebsites.net:80
Accept-Encoding: gzip, deflate
Content-Length: 130
Connection: keep-alive
cache-control: no-cache
{
"clientReadings": {
"sensorA": [],
"sensorB": []
},
"deviceId": 1,
"millilitersConsumed" : 123
}```
(I've changed the domain for this post, so this request won't work if you try to plug it into Postman because myappdomain.azurewebsites.net is not my real domain)