ESP8266 Проблема с подключением к Wi-Fi

У меня есть Feather Huzzah, он же ESP8266, и я пытаюсь подключиться к Wi-Fi.

Одним из важных моментов является то, что мой домовладелец решил использовать худшие SSID и PW Wi-Fi.

SSID содержит ä и пробел, а PW — @.

Я успешно просканировал Wi-Fi с помощью платы и заранее написанного кода, и Wi-Fi появился.

Сейчас я использую базовый клиент Wi-Fi, просто чтобы проверить, можно ли установить какое-либо соединение.

Я пытался записать все специальные символы в Юникоде, но ничего не изменилось.

Вот мой код:

/*
Этот скетч отправляет строку на TCP-сервер и печатает однострочный ответ.
Вам необходимо запустить TCP-сервер в вашей локальной сети.
Например, в Linux вы можете использовать следующую команду: nc -v -l 3000
*/

#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>

#ifndef STASSID
#define STASSID "XXX XXäXX"      //оригинальный SSID
#define STASSID "XXX XX\u00e4XX" //Юникодный SSID
#define STAPSK "XXX@XXX"        //Оригинальный пароль
#define STAPSK "XXX@XXX"        //Пароль Юникод
#endif

const char* ssid = STASSID;
const char* password = STAPSK;

const char* host = "192.168.1.1";
const uint16_t port = 3000;

ESP8266WiFiMulti WiFiMulti;

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

  // Начинаем с подключения к сети Wi-Fi
  WiFi.mode(WIFI_STA);
  WiFiMulti.addAP(ssid, password);

  Serial.println();
  Serial.println();
  Serial.print("Wait for WiFi... ");

  while (WiFiMulti.run() != WL_CONNECTED) {
    Serial.print(".");
    delay(500);
  }

  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  delay(500);
}


void loop() {
  Serial.print("connecting to ");
  Serial.print(host);
  Serial.print(':');
  Serial.println(port);

  // Используем класс WiFiClient для создания TCP-соединений
  WiFiClient client;

  if (!client.connect(host, port)) {
    Serial.println("connection failed");
    Serial.println("wait 5 sec...");
    delay(5000);
    return;
  }

  // Это отправит запрос на сервер
  client.println("hello from ESP8266");

  // считываем одну строку с сервера
  Serial.println("receiving from remote server");
  String line = client.readStringUntil('\r');
  Serial.println(line);

  Serial.println("closing connection");
  client.stop();

  Serial.println("wait 5 sec...");
  delay(5000);
}

Спасибо за любую помощь и привет из Швеции.

, 👍3

Обсуждение

Я скопировал ä в блокнот++ и просмотрел символ с помощью плагина шестнадцатеричного редактора... он состоит из двух байтов c3 a4, @jsotola

Не поймите меня неправильно, но что мне делать с этим ответом? К сожалению, я не глубоко разбираюсь в программировании Arduino. Могу ли я преобразовать байты в символы?, @DaMusikant

это просто информация, а не ответ...ответ был бы в разделе "ответ"...этот сайт не форум, @jsotola

преобразовать байты в char и вставить их в SSID... Понятия не имею, сработает ли результат... Я бы начал с известного SSID, который не содержит проблемных символов... Подключитесь обычным способом, чтобы подтвердить подключение. .. затем замените один из символов тем же символом и убедитесь, что соединение по-прежнему хорошее... это гарантирует, что код вставки символов действителен, @jsotola


2 ответа


0

Начните с известного простого SSID и попробуйте следующее:

#define STASSID "mywifi" // Например, это известный SSID, который соединяет
... ... ...
const char ssid[] = "mywifi";

Если это работает, вы можете заменить char на шестнадцатеричный.

const char ssid[] = {0x6D, 0x79, 0x77, 0x69, 0x66, 0x69};

Если это работает, вы можете заменить шестнадцатеричные байты своим фактическим SSID. И вместо ä используйте эти два шестнадцатеричных байта, как упоминалось в jsotola: 0xC3 и 0xA4.


Изменить 1:

Из комментария видно, что приемник никогда не подключается к Wi-Fi. В аппаратном обеспечении приемника попробуйте что-нибудь простое и посмотрите, подключится он вообще или нет.

#include <ESP8266WiFi.h>

void setup()
{
  Serial.begin(115200);
  Serial.println();

  WiFi.begin("network-name", "pass-to-network");

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();

  Serial.print("Connected, IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {}

Проверьте, какой результат вы получите.

,

Хороший намек. Я подключил плату к точке доступа своего телефона, и все заработало. Так хорошо до сих пор. Но когда я снова пробую локальный Wi-Fi, он мне не нравится. Я заменил const char ssid[] и пароль необработанными шестнадцатеричными числами и прогнал их через несколько конвертеров. Когда я распечатываю его, он выглядит нормально. Но когда я распечатываю пароль, это правильный пароль + снова ssid?! Как будто это одна переменная, сложенная вместе? Это только из-за серийной распечатки?, @DaMusikant

Это звучит неправильно. Можете ли вы опубликовать код, который вы упомянули в комментарии, где в качестве пароля печатаются и пароль, и SSID?, @Fahad

#ifndef СТАССИД #define STASSID {0x6D, 0x79, 0x77, 0x69, 0x66, 0x69} #define STAPSK {0x6D, 0x79, 0x70, 0x61, 0x73, 0x73, 0x77} #endif const char ssid[] = STASSID; const char пароль[] = СТАПСК; ... ... ... Serial.print("Подключение к"); Serial.print(ssid); Серийный.принт(" "); Serial.print(пароль); Подключение к mywifi, @DaMusikant

Извините, я не могу отредактировать это для лучшей читабельности. я не понимаю как это сделать, @DaMusikant

Не беспокойся. Дай мне проверить., @Fahad

Хорошо, это происходит потому, что вы печатаете массив. Раньше, когда вы определяли свой ssid и пароль, вы использовали строку типа «mypassword». В этом случае после буквы идет символ «0x00», завершающийся нулем. Поэтому при попытке печати функция print() знала, когда остановиться, всякий раз, когда видела 0x00. Но в коде комментария вы определяете ssid и пароль как массив. Таким образом, нет «лишнего» нулевого символа. Поэтому print() не знает, когда остановиться. когда вы распечатывали пароль, он, вероятно, содержал SSID в буфере печати из предыдущей печати. Вы не можете напечатать такой массив., @Fahad

Ладно, в любом случае это был всего лишь тест. Это не должно иметь никакого значения во внутренней обработке. Итак, в чем еще может быть проблема? Безопасность роутера?, @DaMusikant

@DaMusikant Я обновил ответ., @Fahad

Наконец-то у меня снова появилось время. Я обнаружил несколько интересных вещей. Когда я попытался подключиться к своей точке доступа, это сработало. Но когда я перевел это имя и пароль, оно не подключилось. Вместо этого я увидел, как мой телефон переключился на то, что кто-то подключился, а затем нет, с интервалом в полсекунды. Кажется, у самого контроллера проблемы с шестнадцатеричными числами. То, что там происходит?, @DaMusikant


1

У меня недостаточно репутации, чтобы комментировать, иначе это был бы комментарий, но вы можете попросить арендодателя сменить пароль. Если он ответит «нет», вы можете сказать, что одно из ваших устройств не может ввести этот символ.

,

Да, я начинаю верить, что это единственное решение :D, @DaMusikant