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);
}
Спасибо за любую помощь и привет из Швеции.
@DaMusikant, 👍3
Обсуждение2 ответа
Начните с известного простого 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
У меня недостаточно репутации, чтобы комментировать, иначе это был бы комментарий, но вы можете попросить арендодателя сменить пароль. Если он ответит «нет», вы можете сказать, что одно из ваших устройств не может ввести этот символ.
Да, я начинаю верить, что это единственное решение :D, @DaMusikant
- ESP8266 не подключается к Wi-Fi
- Как подключить Wi-Fi Shield ESP-12E-ESP8266-UART-WIFI-Wireless-Shield к Arduino
- Можно ли отключить WiFi на ESP8266?
- Как отключить или остановить точку доступа в ESP8266?
- ESP8266 — действительно ли у него по умолчанию плохой радиус действия Wi-Fi?
- ESP8266 на Wi-Fi без пароля, возможно?
- ESP8266 Аналоговое чтение мешает Wi-Fi?
- Каково использование зарезервированных контактов и контактов SDD2, SDD3 NodeMCU?
Я скопировал
ä
в блокнот++ и просмотрел символ с помощью плагина шестнадцатеричного редактора... он состоит из двух байтовc3 a4
, @jsotolaНе поймите меня неправильно, но что мне делать с этим ответом? К сожалению, я не глубоко разбираюсь в программировании Arduino. Могу ли я преобразовать байты в символы?, @DaMusikant
это просто информация, а не ответ...ответ был бы в разделе "ответ"...этот сайт не форум, @jsotola
преобразовать байты в char и вставить их в SSID... Понятия не имею, сработает ли результат... Я бы начал с известного SSID, который не содержит проблемных символов... Подключитесь обычным способом, чтобы подтвердить подключение. .. затем замените один из символов тем же символом и убедитесь, что соединение по-прежнему хорошее... это гарантирует, что код вставки символов действителен, @jsotola