Проблема с telnet

xSWIGx
Offline
Зарегистрирован: 19.03.2014

Всем привет! Создаю телнет сервер на базе ардуино и столкнулся с одной проблемой, надеюсь кто-нибудь поможет ее решить.

Суть вод в чем, когда клиент вводит пароль в введенной строке непонятно откуда появляются посторонние символы: 

 

Хотя в мониторе порта все отображается нормально.

Вот как считываю символы:

 while (passwordCharsReceived < 6 && client.connected())
        {
          c = client.read();
           if (c != -1) {
        if (c == '\r') continue;
        if (c == '\n') break;
        authBuffer[passwordCharsReceived] = c;
      } else delay(10);
          
     
          Serial.print( authBuffer[passwordCharsReceived] );
          passwordCharsReceived++;

 

com
Offline
Зарегистрирован: 06.09.2013

1. настолько маленькие картинки, что  чем "нормально" отличается от "лишние символы" непонятно

2. где конец цикла while? нет закрывающей скобки

 

 

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Может дело и не в этом, но у вас, если c == -1, в Serial выплюнется мусор, который был в буфере и индекс + 1.

Я бы переместил строки 11, 12 и перед 8 строкой

while (passwordCharsReceived < 6 && client.connected())
{
  c = client.read();
  if (c != -1) {
    if (c == '\r') continue;
    if (c == '\n') break;
    authBuffer[passwordCharsReceived] = c;
    Serial.print( authBuffer[passwordCharsReceived] );
    passwordCharsReceived++;
  } 
  else delay(10);
}

Не стесняйтесь в среде нажимать Ctrl-T, тогда и текст скетчас будет приятней, а не это нагромождение

xSWIGx
Offline
Зарегистрирован: 19.03.2014

Извиняюсь за плохой скрин, вот увеличенная версия:

По коду в терминал после ввода пароля выводится он же, это видно по коду:

client.println ("\nPassword>");
        timeOfLastActivity = millis();
        client.flush();
        passwordCharsReceived = 0;
        passwordCharsWaiting = 0;
        delay(300);
       for ( ;!client.available() ; )  checkConnectionTimeout();
        
        passwordCharsWaiting = client.available();
        while (passwordCharsReceived < 6 && client.connected())
        {
          c = client.read();
           if (c != -1) {
        if (c == '\r') continue;
        if (c == '\n') break;
        authBuffer[passwordCharsReceived] = c;
      } else delay(10);
          
     
          Serial.print( authBuffer[passwordCharsReceived] );
          passwordCharsReceived++;
          
        }

 

Последние символы в пароле заменяются какими-то непонятными знаками, а монитор порта выводятся нормальные символы.

Из-за этого не могу организовать нормальную аунтефикацию.

com
Offline
Зарегистрирован: 06.09.2013

чего-то я логику не до конца понимаю, зачем вводить 8 символов, а считывать 6? какой тип у authBuffer?

authBuffer[6]='\0';

и 9-я строчка лишняя

xSWIGx
Offline
Зарегистрирован: 19.03.2014

Действительно, 9 строчка осталась от старых попыток и здесь не имеет значения. authBuffer и authData - массивы символов (char) с размерностью 6. Считывается не 8 символов, а 2 раза по 4, это происходит из-за того, что пользователю дано 3 попытки на ввод пароля (перед каждой попыткой client.flush()). В мониторе порта показаны 2 попытки ввода без разделения. Единственный вопрос, почему в монитор порта и в терминал выводятся разные символы.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Я Вам пример показал в сообщении #2, как надо сделать, но Вы его не заметили

http://arduino.ru/forum/programmirovanie/problema-s-telnet#comment-61183

Попробуйте

com
Offline
Зарегистрирован: 06.09.2013

xSWIGx пишет:
... Считывается не 8 символов, а 2 раза по 4,

да, не 8, я и писал, что не 8, а 6. яснее не стало - вводите 4, считываете 6

while (passwordCharsReceived < 6 && client.connected())

 

xSWIGx
Offline
Зарегистрирован: 19.03.2014

kisoft пишет:

Я Вам пример показал в сообщении #2, как надо сделать, но Вы его не заметили

http://arduino.ru/forum/programmirovanie/problema-s-telnet#comment-61183

Попробуйте

 

Извините, что не отписал, но ваш вариант не сработал. Теперь в терминал выплевывается абсолютный бред:

Такое просто не возможно, ведь размер строки пароля ограничен 6 символами.

  char authData[] = "111111";
  char authBuffer[6];

  char c;

 

    client.println ("\nPassword>");
    timeOfLastActivity = millis();
    client.flush();
    passwordCharsReceived = 0;
    passwordCharsWaiting = 0;
    delay(300);
    for ( ;!client.available() ; )  checkConnectionTimeout();

   // passwordCharsWaiting = client.available();
    while (passwordCharsReceived < 6 && client.connected())
    {
      c = client.read();
      if (c != -1) {
        if (c == '\r') continue;
        if (c == '\0') continue; 
        if (c == '\n') break;
        authBuffer[passwordCharsReceived] = c;
        Serial.print( authBuffer[passwordCharsReceived] );
        passwordCharsReceived++;
      } 
      else delay(10);

    }

Бывает и такой вариант:

xSWIGx
Offline
Зарегистрирован: 19.03.2014

Мне кажется, от этого не должно зависить, ведь в цикле есть условие:

if (c == '\n') break;

 

com
Offline
Зарегистрирован: 06.09.2013

а вы думаете, что если поменяете первые 4 символа в строке char buffer[6], то она автоматически станет короче на два символа? а вот и нет! я же не зря написал, что надо в конце '\0' записывать

xSWIGx
Offline
Зарегистрирован: 19.03.2014

Огромное спасибо! Я понял вас и все встало на свои места. Все работает!

com
Offline
Зарегистрирован: 06.09.2013

ура!

:)

xSWIGx
Offline
Зарегистрирован: 19.03.2014

Как-то я не подумал, что концу строки неоткуда взяться. Еще раз спасибо за наводку, теперь продолжу разработку)