WiFiClientSecure функция readString медленная - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть эскиз, который запрашивает токен устройства у Facebook для аутентификации Wemos D1 Mini.

В общем, я хочу воспроизвести следующее, что дает мне код устройства менее чем завторой:

curl https://graph.facebook.com/v2.7/device/login -d "type = device_code & access_token = MYTOKEN"

Я создал следующий эскиз, который работает, хотя и очень медленно.Он получает токен устройства примерно через 17 секунд.Похоже, что String response = client.readString ();виновник

Может ли кто-нибудь дать совет о том, почему это может быть и как это исправить?

Спасибо,

Нейт

#include <ESP8266WiFi.h>
#include <WiFiClientSecure.h>
#include <ArduinoHttpClient.h>
#include <ArduinoJson.h>

WiFiClientSecure client; //edited

void setup() {
    connect(WIFI_SSID, WIFI_PWD); //edited
    Serial.println(getFBDeviceToken());
}

void connect(const char* WIFI_SSID, const char* WIFI_PWD) {

  delay(1000);
  WiFi.persistent(false);
  delay(1000);
  WiFi.mode(WIFI_STA);    

  if (WiFi.status() == WL_DISCONNECTED) {    
    WiFi.begin(WIFI_SSID, WIFI_PWD);
    while(WiFi.status() != WL_CONNECTED){
      delay(1000);
      Serial.println("connecting...");
    }
    Serial.println("\r\n"+WiFi.localIP());
  }    
}

String getFBDeviceToken(){

  //Connect to FB SSL
  if(!client.connect(host, httpPort)){
    return "** Failed to connect **";
  }

  client.println("POST " + path + " HTTP/1.1");
  client.println("Host: " + String(host));
  client.println("User-Agent: ESP8266/1.0");
  client.println("Connection: close");
  client.println("Content-Type: application/x-www-form-urlencoded;");
  client.print("Content-Length: ");
  client.println(data.length());
  client.println();
  client.println(data);

  String response = client.readString(); 
  int bodypos =  response.indexOf("\r\n\r\n") + 4;


  DynamicJsonBuffer jsonBuffer;
  JsonObject& root = jsonBuffer.parseObject(response.substring(bodypos));

  String device_token = root[String("user_code")];

  return device_token;
}

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Если заглянуть под капот, readString() всегда читает все данные, а когда он читает последний символ, он застревает при взаимодействии с сервером.

Чтобы избежать этого, не следует каким-либо образом читать последний символ.

Я читаю заголовки с помощью readStringUntil('\n') и ищу Content-Length заголовок.

Когда заголовки прочитаны, просто используйте readBytes с длиной содержимого. HTTP-запрос теперь занимает около 150 мс.

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

Я не уверен, что это все еще актуально для вас, но я столкнулся с той же ситуацией, и я считаю, что нашел решение. Если это не относится к вам, возможно, это поможет некоторым другим, особенно с учетом того, что библиотека WiFiClientSecure по умолчанию скоро будет переключена на BearSSL, и в настоящее время поддержка существующей реализации не предоставляется.

Хотя мне не удалось ускорить функцию readString, я использовал функцию WiFiClientSecure::read(uint8_t *buf, size_t size) для получения данных с сервера:

// Buffer size, 128 bytes in this case
#define RESP_BUFFER_LENGTH 128
// Pointer to actual buffer
uint8_t * _buffer = new uint8_t[RESP_BUFFER_LENGTH];
// String to hold the final response
String _responseString = "";
// If info is still available
while (wifiClient.available())
{
    // Fill the buffer and make a note of the total read length 
    int actualLength = wifiClient.read(_buffer, RESP_BUFFER_LENGTH);
    // If it fails for whatever reason
    if(actualLength <= 0)
    {
        // Handle as you see fit
        return -1;
    }
    // Concatenate the buffer content to the final response string
    // I used an arduino String for convenience
    // but you can use strcat or whatever you see fit
    _responseString += String((char*)_buffer).substring(0, actualLength);  
}
// Clear buffer memory
delete[] _buffer;

Я не знаю, почему обычное readString () так медленно, но этот метод значительно быстрее, с моими относительно небольшими сообщениями (~ 50 байт), ответ читается почти мгновенно.

...