ESP32-WROOM-32 Wifisecureclient read() приводит к тарабарщине данных

Мы тестируем нашу собственную библиотеку с ESP32-wroom-32.

В файле .cpp у нас есть:

void HttpDownstreamClient::tokenCreate(char* URL, char* Subname, char* Suber, int expiretime) {

  Serial.print("The subscription is associated with the Subscripter: ");
  Serial.println(Suber);

  StaticJsonDocument<200> root;
 
  root["subscriber"] = Suber;
  root["subscription"] = Subname;
  root["expiresInMinutes"] = expiretime;
  String body2send = "";

  serializeJsonPretty(root, body2send);

  if (_networkClient->connect(URL, 443)) {
    Serial.println("Connected to the server to request token!");
    // Делаем HTTP-запрос:
    _networkClient->println("POST /notification2/token HTTP/1.1");
    _networkClient->print("Host: ");
    _networkClient->println(URL);
    _networkClient->print("Authorization: Basic ");
    _networkClient->println(_base64);
    _networkClient->println("Content-Type: application/json");
    _networkClient->print("Content-Length: ");
    _networkClient->println(body2send.length());
    _networkClient->println("Accept: application/json");
    _networkClient->println();
    _networkClient->println(body2send);

  }
  

while (_token.length() == 0) {
    String msg = "";
    while (_networkClient->available()) {
      char c = _networkClient->read();
      msg += c;
    }
    Serial.println(msg);
    int start_init = msg.indexOf("\"token\"");
    int start = msg.indexOf(":",start_init);
    int until_n = msg.indexOf("\"", start + 3);
    Serial.println(until_n);
    if (start != -1 && until_n != -1 ) {
      _token = msg.substring(start + 2, until_n);
      Serial.print("Token is: ");
      Serial.println(_token);
     }
  }
 
}

_token – это внутренняя переменная строкового типа, в которой должен храниться токен.

В .h у нас есть следующее:

class HttpDownstreamClient{


 private:

 String _token;
 char* _base64;
 //char* _msgToken;
 //Строка _deviceID;

#if defined(ARDUINO_ARCH_ESP32)
  //Кодер Base64 для ESP32
  void base64ESP(char* username, char* password);
#else
  //Кодер Base64 ни для одной платы ESP32
  void base64(char* username, char* password);
#endif
 
 
 public:

 Client* _networkClient;


Файл .ino выглядит следующим образом:

#include <HttpDownstream.h>
#include <WiFi.h>
#include <WiFiClientSecure.h>

WiFiClientSecure wifisecure;
HttpDownstreamClient c8yclient(wifisecure); //инициируем HttpDownstreamClient

char* host = "hello.cumulocity.com";
char* username = "hello";
char* password = "hello";
char* device_id = "13225";

//Тест подписки
char* SubscriptionName = "NotificationV2Test11";
char* SubscriberName = "Test2Sub1";
char* APIs = "measurements";
char* typeFilter= "";
char* fragmentsToCopy= "";
int expiretime = 1100;


char ssid[] = "hello";        // SSID вашей сети (имя)
char pass[] = "hello";    // ваш сетевой пароль (используйте для WPA или используйте в качестве ключа для WEP)
int status = WL_IDLE_STATUS;

void setup()
{
    Serial.begin(115200);
    delay(10);

 wifisecure.setInsecure();
 while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to SSID: ");
    Serial.println(ssid);
    // Подключиться к сети WPA/WPA2. Измените эту строку, если используете открытую сеть или сеть WEP:
    status = WiFi.begin(ssid, pass);

    // ждем 5 секунд соединения:
    delay(5000);
  }

 Serial.println("Connected to WiFi"); 
 

  c8yclient.tokenCreate(host, SubscriptionName, SubscriberName, expiretime);
  // задержка (6000);
  //c8yclient.connectWSS(host,SubscriberName);
  // задержка (5000);
    
}


void loop()
{
  while (wifisecure.available()) {
    char c = wifisecure.read();
    Serial.print(c);
  }

   
}


Проблема в том, что я получу следующий результат:

21:31:57.993 -> The subscription is associated with the Subscripter: Test2Sub1
21:31:58.033 -> Connected to the server to request token!
21:31:58.073 -> ⸮

Я действительно не знаю, как эта тарабарщина "⸮" родом из. Скорость передачи данных составляет 115 200 бод как в методе begin(), так и в последовательном мониторе.

В чем причина?

, 👍0

Обсуждение

Разве Client* _networkClient; не должно быть WiFiClientSecure* _networkClient? Как вы инициализируете _networkClient, поскольку ваш HttpDownstreamClient, похоже, не имеет конструктора для инициализации _networkClient?, @hcheung

@hcheung WiFiClientSecure wifisecure; HttpDownstreamClient c8yclient (wifisecure);, @YIL

@hcheung Но WifiClientSecure является подклассом Client. Пробовал с другими платами, проблем нет., @YIL