Как сделать безопасный запрос API от Arduino ESP32, запрограммированного в Arduino IDE с использованием ArduinoJson? - PullRequest
0 голосов
/ 12 октября 2018

Я взломал это несколько дней без удачи.

Я пытаюсь сделать безопасный (SSL / HTTPS) запрос API в среде Arduino.Контроллер, который я использую, - это ESP32, который подключается через Wi-Fi и может извлекать / публиковать данные.Однако мне не везет при подключении к безопасному API.

Я пытаюсь подключиться к этому API https://strike.acinq.co/documentation/api-reference

ПРИМЕР ЗАПРОСА СВОЙСТВА В ДОКУМЕНТАЦИИ API:

$ curl https://api.dev.strike.acinq.co/api/v1/charges \
   -u sk_pJDwxFxCVw5fQJhRRMpf29jReUjjN: \
   -X POST \
   -d amount=42000 \
   -d currency="btc" \
   -d description="1%20Blockaccino" 

ref ref

Вот мой код Arduino, я использую библиотеки ArduinoJson.h и WiFi.h:

// Connect to HTTP server
WiFiClient client;
client.setTimeout(10000);
if (!client.connect("api.strike.acinq.co", 80)) {
  Serial.println(F("Connection failed"));
return;
}

Serial.println(F("Connected!"));
// Send HTTP request
client.println(F("GET /api/v1/charges?id=MYKEY&amount=4200&currency=btc HTTP/1.0"));
client.println(F("Host: api.strike.acinq.co"));
client.println(F("Content-Type: application/x-www-form-urlencoded"));
client.println(F("Connection: close"));
if (client.println() == 0) {
   Serial.println(F("Failed to send request"));
return;
}

// Check HTTP status
char status[32] = {0};
client.readBytesUntil('\r', status, sizeof(status));
if (strcmp(status, "HTTP/1.1 200 OK") != 0) {
  Serial.print(F("Unexpected response: "));
  Serial.println(status);
return;
}

401 «Неверный ключ API»самый близкий у меня есть.Я знаю, что API-ключ работает, и я просто неправильно его использую.Я попытался переместить ключ на:

 client.println(F("id: MYKEY"));

, но это тоже не сработало.

Я пробовал другие библиотеки, и ArduinoJson кажется лучшим.Я думаю, что проблема в том, что это безопасный сервер и схема моего запроса.Я нашел много ресурсов для подключения к открытым API на Arduino, но ничего не для подключения к безопасным.Я думаю, что я почти там с кодом ...

ОБНОВЛЕНИЕ

Итак, я обновил свой код.Я все еще пытаюсь использовать ArduinoJson.Я могу подключиться к API, но он продолжает выплевывать «HTTP / 1.1 400 BAD_REQUEST».Я не знаю, погода это потому, что это через HTTPS или форматирование моего запроса.

В API-документах -u и -X нет имени поля, например "amount = 4200", поэтому я предполагаю, что -u просто добавится client.print("?="+apiKey);

//open weather map api key 
String apiKey= "myapikey"; 

int status = WL_IDLE_STATUS; 
char server[] = "api.strike.acinq.co";    



Serial.println("\nStarting connection to server..."); 
// if you get a connection, report back via serial: 
if (client.connect(server, 80)) { 
  Serial.println("connected to server"); 
  // Make a HTTP request: 
  client.print("POST /api/v1/charges"); 
  client.print("?="+apiKey); 
  client.print("&amount=4200"); 
  client.print("&currency='btc'"); 
  client.println("&description='sweets'"); 
  client.println("Host: api.strike.acinq.co"); 
  client.println("Connection: close"); 
  client.println(); 
} 
else { 
  Serial.println("unable to connect"); 
}

ОБНОВЛЕНИЕ

Я понял, что println и print на самом деле что-то значат, и впоследствии организовал мой запрос намного лучше.Это все еще возвращается с 400 Несанкционированными?

String PostData = "&description=\"car\"&amount=1000&currency=\"sweetsandthat\"";

client.println("POST /api/v1/charges HTTP/1.1"); 
client.println("Host: api.strike.acinq.co");
client.println("Authorization: Basic "+apiKey);
client.print("Content-Length: ");
client.println(PostData.length());
client.println(); // blank line required
client.println(PostData);

Serial.println("POSTED DATA: " + PostData);
// client.stop();

client.println(); 
} else { 
Serial.println("unable to connect"); 
} 

delay(1000); 
 String line = ""; 
 while (client.connected()) { 
 line = client.readStringUntil('999'); 
 Serial.println(line); 
 Serial.println("parsingValues"); 
 //create a json buffer where to store the json data 
 StaticJsonBuffer<5000> jsonBuffer; 
 JsonObject& root = jsonBuffer.parseObject(line); 
 if (!root.success()) { 
   Serial.println("parseObject() failed"); 
   return; 
 } 
 //get the data from the json tree 
 String nextWeatherTime0 = root["id"][0];
 // Print values. 
 Serial.println(nextWeatherTime0); 

 } 
 client.println("Connection: close"); 
 client.stop();
 }

compiled

Ответы [ 2 ]

0 голосов
/ 13 апреля 2019

Я также изо всех сил пытался заставить сообщение https работать на esp32.Несколько вещей, модуль wifi.h, я полагаю, не поддерживает https.WiFiClientSecure.h работает, и вам нужно установить порт на 443. Мне также не удалось заставить POST работать, но мне удалось установить базовое тестовое соединение GET с howsmysssl.com.Andreas Spiess хорошо освещает это видео на YouTube.Он выходит за рамки SSL для установления доверия.Я просто хочу, чтобы базовый SSL работал, поэтому, если вы выясните это, пожалуйста, дайте мне знать.Надеюсь, я подобрал тебя на шаг ближе.:)

0 голосов
/ 17 октября 2018

Проверьте ответ на BAD-запрос. Обычно мы получаем его, когда имеем дело с неверным URL-адресом или URL-адресом не найден.проверьте, подключаетесь ли вы к тому же URL-адресу, который указан в документации.Сначала подключитесь к API, а затем выполните запросы, например, предоставив свой ключ API и файлы, удалите его.

 client.println("Host: api.strike.acinq.co");

и используйте запрос GET, чтобы получить ответ данных, которые у вас есть в этих полях

 String PostData = "&description=\"car\"&amount=1000&currency=\"sweetsandthat\""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...