近期因为一个项目需要处理esp8266连接中文名称wifi的情况,才发现8266不能直接连接中文WiFi的问题。
具体场景:在代码中配置ssid与pwd,其中ssid为中文,通过设置手机热点为同名AP,测试连接 中文名称的wifi。
现象:串口调试信息显示,一直未能发现该中文WiFi
猜测:8266扫描到的ssid编码和我配置的ssid编码方式不一样,因此不能匹配
验证:先扫描出附近的AP,将其SSID每一个字节打印出来,在将配置的SSID每一个字节打印即可验证
代码:
wifi_set_opmode_current(STATION_MODE);
xTaskCreate(wifi_test_scan, "wifi_test_check_ip", 600, NULL, 2, &xWifitestTaskHandle);
static void ICACHE_FLASH_ATTR wifi_test_scan(void *arg)
{
struct ip_info ipConfig;
log_info("wifi_test_scan.");
for(;;)
{
bool Loflag =wifi_station_scan(NULL, myscan_done);
if(Loflag == true){
log_info("@@@@@success");
}else if(Loflag == false){
log_info("@@@@@false");
}
vTaskDelay(6000 / portTICK_RATE_MS);//delay 1s
}
}
void ICACHE_FLASH_ATTR
myscan_done(void *arg, STATUS status)
{
uint8 ssid[33];
char temp[128];
log_info("$$$$enter scan_done####");
if (status == OK)
{
struct bss_info *bss_link = (struct bss_info *)arg;
while (bss_link != NULL)
{
memset(ssid, 0, 33);
if (strlen(bss_link->ssid) <= 32)
{
memcpy(ssid, bss_link->ssid, strlen(bss_link->ssid));
}
else
{
memcpy(ssid, bss_link->ssid, 32);
}
printf("(%d,\"%s\",%d,\""MACSTR"\",%d)\r\n",
bss_link->authmode, ssid, bss_link->rssi,
MAC2STR(bss_link->bssid),bss_link->channel);
log_info("@@@@the ssid'len is:%d",strlen(ssid));
int i = 0;
for(i = 0; i < strlen(ssid);i++){
log_info("@@@@the ssid No.%d ascci is:%d",i,ssid[i]);
}
bss_link = bss_link->next.stqe_next;
}
}
else
{
printf("scan fail !!!\r\n");
}
}
串口调试图:
我设置的手机热点名称为: 张
串口打印显示,张字编码为三个字节,三个字节的ASCCI码为:229、188、160,对应显示为 e5 bc a0
通过查验汉字编码的可能的编码结果,得到这是URL编码的变形,
URL编码下,张 字的编码为:%e5%bc%a0
而url编码被用在http传输中,我是用AP热点配网时,通过客户端浏览器提交到esp8266上server的中文形式就是经过URL编码的,因此二者可以配合使用
使用8266作为AP进行热点配网时候,在html中的中文是通过UTF8编码后传输