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(), так и в последовательном мониторе.
В чем причина?
@YIL, 👍0
Обсуждение0
Смотрите также:
- esp32 Stack canary watchpoint срабатывает
- Увеличить частоту дискретизации на плате ESP32
- Использование лямбд в качестве функций обратного вызова
- Преобразование строки C в строку C++
- Считывание данных нескольких датчиков из текстового файла, расположенного на SD-карте в Arduino/ESP32
- Не могу скомпилировать .ino с помощью библиотеки ArduinoJson
- Тот же код работает на Arduino IDE, но не в PlatformIO IDE
- C++ против языка Arduino?
Разве
Client* _networkClient;
не должно бытьWiFiClientSecure* _networkClient
? Как вы инициализируете _networkClient, поскольку ваш HttpDownstreamClient, похоже, не имеет конструктора для инициализации _networkClient?, @hcheung@hcheung WiFiClientSecure wifisecure; HttpDownstreamClient c8yclient (wifisecure);, @YIL
@hcheung Но WifiClientSecure является подклассом Client. Пробовал с другими платами, проблем нет., @YIL