首页 > 编程知识 正文

esp8266接收wifi数据,esp8266无线wifi模块的使用

时间:2023-05-06 17:19:04 阅读:251601 作者:1587

大家好,在这里我将要给大家介绍一下如何将自己的ESP8266设置成Station模式,并且去连接别的wifi;废话不多说,直接开干.

在这里因为要进行串口输出采集的信息,所以我们先初始化串口;
调用uart_init(115200,115200);来进行初始化
首先我们先获取我们ESP8266当前的模式;
获取完以后,我们调用这个函数去设置我们的ESP8266的模式;
这个函数设置的模式不会被保存到FLASH中,你要是想要每次上电以后自动设置成station模式的话你可以调用wifi_set_opmode(0x01)函数;好了,到了这一步我们这是设置好我们的ESP8266的station模式了。
因为要连接wifi,所以我们先要去扫描一下现在周边的WiFi有什么,


这个就是扫描WiFi所用到的函数,在这个函数中有两个参数,一个是struct scan_config *config这个就是你要设置的WiFi的结构体,另一个是一个回调函数;scan_done_cb_t cb: cb;所以在这里我们需要去设置一个回调函数去调用我们这个scan 函数
写完这个回调函数以后我们去写scan函数,scan 函数里面有两个结构体,在这里我们用到bss_info这个结构体,首先我们将bss_link 指向下一个bss_link,如果下一个不是NULL,那么我们就判断一下扫描的WiFi的名字长度,如果小于33就copy过去,大于33就copy前33个名字;这里讲一下os_memset();这个函数是将你的数组全部置为一个数(这里我们用其来初始化我们的数组);os_memcoy()这个函数我们是用来复制我们扫描到的WiFi的名字的,然后就开始打印扫描到的WiFi的参数,ssid(名字),rssi(Received Signal Strength Indication接收的信号强度指示);bssd(BSSID就是被桥接的无线网络的MAC地址);authmode;因为要连接WiFi所以我们还要配置下ESPstation模式的结构体
这里有四个参数,ssid是你要连接的WiFi的名字,password是你要连接的WiFi的密码;
然后要连接所以调用下面这个函数


调用这个connect函数;

因为你不确定是不是真的连接上了没有,接下来我们设置一个定时器的函数,去定时的扫描一下是不是真的连上了吗;设置一个conned函数;

这里只要进入这个函数,我们就先把定时器关掉,因为如果定时器的时间太短的话,我们的程序就会卡死在这个了,他会无限的递归了.然后我们去看看他的状态是什么,如果是成功的话,就把定时器关掉,不在打开了,如果不是的话,我们就将count(用来记录连接一个WiFi尝试的次数 的一个计数值);然后在else里面打开定时器,如果记录的次数大于7的话,我们就printf()失败了,然后也将定时器关掉。配置好这些,我们在user_init()里最后加一个系统的回调函数
这个函数必须调用(只要你使用station模式);
好了这里我们就配置成功了,上一个结果图;

代码在下面

///*// * user_main.c// *// * Created on: 2015年6月9日// * Author: zailushang// */#include "driver/uart.h"#include "user_main.h"ETSTimer Timer;//定时器的一个结构体参数void ICACHE_FLASH_ATTR Wifi_conned(void *arg){static uint8 count=0;//记录不成功的次数uint8 status;//记录连接状态os_timer_disarm(&Timer);//将定时器关闭count++;status=wifi_station_get_connect_status();//获得连接的状态if(status == STATION_GOT_IP){os_printf("Wifi Connected successfully");//如果成功打印信息os_timer_disarm(&Timer);//关闭定时器}else{os_timer_arm(&Timer,2000,NULL);//不成功的话,打开定时器进行下一次的查看是否连接上if(count>=7){os_printf("Wifi Connected failly");//如果查看了7次还没连接上的话,就打印连接失败os_timer_disarm(&Timer);//关掉定时器,不在去查看连接状态了}}}void ICACHE_FLASH_ATTR scan_done(void *arg,STATUS status){uint8 ssid[33];//WiFi名字的一个数组struct station_config stationConf;//这个station的一个配置的结构体if(status == OK)//如果状态是NULL{struct bss_info *bss_link = (struct bss_info *)arg;//将其强制转换成bss_inf的结构体bss_link = bss_link->next.stqe_next;//bss_info之指向下一个wifi while(bss_link != NULL) { os_memset(ssid,0,33);//初始化ssid这个是数组 if(os_strlen(bss_link->ssid)<= 33)//名字下小于33 { os_memcpy(ssid,bss_link->ssid,os_strlen(bss_link->ssid));//直接copy过去 } else { os_memcpy(ssid,bss_link->ssid,33);//大于33只将前33个字copy过去 } os_printf("+CWLAP:(%d,"%s",%d,""MACSTR"",%d)rn", bss_link->authmode,ssid,bss_link->rssi,MAC2STR(bss_link->bssid),bss_link->channel);//打印输出获得WiFi的各个参数 bss_link = bss_link->next.stqe_next;//指向下一个wifi } os_memcpy(&stationConf.ssid,"MX5",os_strlen("HelloWord"));//配置你要连接的WiFi的名字 os_memcpy(&stationConf.password,"1234567890",os_strlen("0123456789"));//你要连接的WiFi的密码 wifi_station_set_config_current(&stationConf);//配置你刚才设置的wifi配置 wifi_station_connect();//连接那个wifi os_timer_disarm(&Timer);//不使能定时器 os_timer_setfn(&Timer,Wifi_conned,NULL);//将回调函数绑定 os_timer_arm(&Timer,2000,NULL);//初始化定时器的时间以及使能定时器 }}void to_scan(void){wifi_station_scan(NULL,scan_done);//扫描WiFi函数}void user_init(){uint8 mode=0;uart_init(115200,115200);//初始化串口(波特率是115200);mode = wifi_get_opmode();//获得当前的模式os_printf("当前的工作模式是:%drn",mode);//打印出来wifi_set_opmode_current(0x01);//设置成station模式mode = wifi_get_opmode();//获得当前模式os_printf("当前工作模式是:%drn",mode);//打印出模式看看是否设置成功了没system_init_done_cb(to_scan);//这个回调函数必须在station模式配置成功下才可以调用}void user_rf_pre_init(){}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。