AlexGyver / GyverLamp2

Огненная лампа v2
154 stars 72 forks source link

Не воспринимает пароли к WiFi с запятой #11

Open h4tr3d opened 2 years ago

h4tr3d commented 2 years ago

Токенайзер бьёт по запятой и заменяет её на '\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';    
}
d347h4ck commented 2 years ago

Я предполагаю, что есть 2 возможных варианта решения: 1) Сделать в приложении диалог с 2 инпутами, и сразу при передаче передавать с /0 2) Вместо запятой сделать ; тк этот символ в паролях встречается реже

h4tr3d commented 2 years ago

Первый пункт решает вопрос UI, в протокольной части всё так же будет ,. Второй - не сильно лучше того, что есть. Как вариант, можно кодировать BASE64, там точно только цифры и буквы будут и отправлять. На приёмнике распаковыывать. BASE64 не сильно много ресурсов требует.