GyverLamp2
GyverLamp2 copied to clipboard
Не воспринимает пароли к WiFi с запятой
Токенайзер бьёт по запятой и заменяет её на '\0', нужно как-то эскейпить её на стороне приложения и восстанавливать в прошивке.
Или, как вариант, передавать размер строк. Т.е. сейчас команда установки выглядит так:
GL,0,10,gaz,pass,with,comma,5,18,50,34
и части with
и comma
интерпретируются как части другой команды.
Вариант решения такой, что бы не заморачиваться с экранированием, свести команду к:
GL,0,10,SSID_SIZE,SSID,PASS_SIZE,PASS_WITH_ANY_SYMBOLS,5,18,50,34
Процессинг возможен такой:
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdint>
int main()
{
const char *s = "GL,0,10,3,gaz,15,pass,with,comma,5,18,50,34";
char buf[256]{};
char data[256]{};
memcpy(buf, s, strlen(s));
int count = 0;
char *str, *p = buf;
char *ssid, *pass;
while ((str = strtok_r(p, ",", &p))) {
uint32_t thisInt = (uint32_t)atoi(str);
data[count++] = char(thisInt);
//std::cout << str << "\n -> " << p << '\n';
if (data[1] == 0) {
if (count == 4) {
if (strlen(p) >= thisInt) {
ssid = p;
ssid[thisInt] = '\0';
p += thisInt + 1;
}
}
if (count == 5) {
if (strlen(p) >= thisInt) {
pass = p;
pass[thisInt] = '\0';
p += thisInt + 1;
}
}
}
}
std::cout << "ssid: " << ssid << ", pass: " << pass << '\n';
}
Я предполагаю, что есть 2 возможных варианта решения:
- Сделать в приложении диалог с 2 инпутами, и сразу при передаче передавать с /0
- Вместо запятой сделать ; тк этот символ в паролях встречается реже
Первый пункт решает вопрос UI, в протокольной части всё так же будет ,
. Второй - не сильно лучше того, что есть.
Как вариант, можно кодировать BASE64, там точно только цифры и буквы будут и отправлять. На приёмнике распаковыывать. BASE64 не сильно много ресурсов требует.