ESP8266_10 ESP8266的STATION模式

 

ESP8266_01搭建开发环境

ESP8266_02程序的编译与下载

ESP8266_03SDK与Makefile的基本用法

ESP8266_04管脚控制与软件定时器

ESP8266_05 ESP8266有几个串口?

ESP8266_06硬件定时器与IO中断

ESP8266_07基于PWM的呼吸灯

ESP8266_08基于flash的数据掉电保护

ESP8266_09基于IIC控制的OLED屏幕

ESP8266_10 ESP8266的STATION模式

ESP8266_11 ESP8266的UDP广播

ESP8266_12 ESP8266客户端模式下的TCP通信

ESP8266_13服务器端模式下的TCP通信

ESP8266_14 SOFTAP模式下的服务器端和客户端

ESP8266_15天气预报之TCP的GET操作

ESP8266_16天气预报之JSON数据的生成与解析

ESP8266_17简单网络时间协议-SNTP

ESP8266_18 MQTT协议接入ONENET平台

ESP8266_19MQTT协议接入ONENET平台_订阅主题

ESP8266_20 基于ONENET平台的数据上传之TCP的POST操作

ESP8266_21基于ESP8266的一键配网

ESP8266_22基于自身ADC的电压采样

ESP8266_23基于硬件定时器的红外遥控器解码

        从这一节开始,聊聊8266的联网功能,首先是它的几个工作模式:station,soft-ap,station+ soft-ap。这一节主要说它的station模式。

         station模式就是客户端模式的意思,说白了,就像联网的电脑、手机一样,属于一个客户端。你可以连接到路由器上,然后通过访问网络,发送或者获取你想要的信息。

         如何使用?很简单,分四步:

         1、添加相关头文件

         从SDK中复制ip_addr.h、queue.h、spi_flash.h到新工程的根目录下的include文件夹中,如果已经有了,就算了。

         2、读取当前的工作模式,并修改

         wifi_get_opmode();          //读取当前的工作模式

         返回值wifi工作模式:

         0x01,station模式

         0x02,soft-ap模式

         0x03,station+ soft-ap模式

 

         wifi_set_opmode(0x01);                             //设置当前的工作模式,并保存到flash

         wifi_set_opmode_current(0x01);             //设置当前的工作模式,不保存到flash

 

         3、扫描当前环境下的wifi信息,并打印出来

         wifi_station_scan(NULL,scan_done);

         第一个参数为0,表示扫描所有的wifi,如果不为0,扫描特定名称的AP信息,一般默认为0.具体可参照手册。

         第二个参数为扫描完成的回调函数,需要我们自己声明并定义。但其实在早期版本的开发环境中,提供了一个at_firmware工程的源码,里面有相关的代码,可直接使用。现在版本下已经没有这个工程了,所以我这里直接放出源码,大家会用即可。

void ICACHE_FLASH_ATTR scan_done(void *arg,STATUS status)

{

         uint8 ssid[33];

         struct station_config stationConf;

           if (status == OK)

           {

             struct bss_info *bss_link = (struct bss_info *)arg;

             while (bss_link != NULL)

             {

               os_memset(ssid, 0, 33);

               if (os_strlen(bss_link->ssid) <= 32)

               {

                 os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid));

               }

               else

               {

                 os_memcpy(ssid, bss_link->ssid, 32);

               }

               os_printf("+CWLAP:(%d,\"%s\",%d,\""MACSTR"\",%d)\r\n",

                          bss_link->authmode, ssid, bss_link->rssi,

                          MAC2STR(bss_link->bssid),bss_link->channel);

               bss_link = bss_link->next.stqe_next;

             }

             os_memcpy(&stationConf.ssid, " shatanliu", 32);

             os_memcpy(&stationConf.password, "11223344", 64);

             wifi_station_set_config_current(&stationConf);

             wifi_station_connect();

             os_timer_setfn(&connect_timer,Wifi_conned,NULL);

             os_timer_arm(&connect_timer,2000,1);

           }

           else

           {

           }

}

         注意事项:

         a、里面涉及到了链表的用法(bss_info),没用过的同学可以百度一下。简单来说,是用来存储数据的,和数组的区别在于,声明数组的时候,数组大小必须是固定的;但链表不一样,它是动态分配内存,用多少,开辟多少,不会浪费。

         b、shatanliu是我家里的wifi名字,11223344是wifi密码,你要用我代码的话,要改成自己的。

 

         4、连接wifi

         其实相关的代码已经在上面了:

         先定义一个结构体,用来存储家里的wifi信息

         struct station_config stationConf;

         然后存入账户、密码

         os_memcpy(&stationConf.ssid, " shatanliu", 32);

         os_memcpy(&stationConf.password, "11223344", 64);

         设置wifi信息,并连接

         wifi_station_set_config_current(&stationConf);

         wifi_station_connect();

 

         5、查看wifi是否已经连接

         wifi_station_get_connect_status();

         返回值如下:

enum{

STATION_IDLE = 0,

STATION_CONNECTING,

STATION_WRONG_PASSWORD,

STATION_NO_AP_FOUND,

STATION_CONNECT_FAIL,

STATION_GOT_IP

};

         除了“STATION_GOT_IP”,其它的都是没连上。

         这里,使用了一个软件定时器,每隔2秒读取一下连接状态,如果连接成功,则打印相关信息,如果连续七次读取失败,连接失败。

         注:上述所有调用函数,参考手册2c-esp8266_sdk_api_guide_cn_v1.5.4。

 

程序修改完成,保存、清理、编译、下载一条龙,然后重新上电,效果如下所示:

         如图所示,上电后先后显示当前工作模式,然后是修改后的模式,然后是当前环境下的wifi,然后进行连接,最后连接成功。

完整工程源码,请关注公众号:单片机爱好者,回复关键字:ESP8266,即可获取。

单片机爱好者

发布了27 篇原创文章 · 获赞 7 · 访问量 5200

猜你喜欢

转载自blog.csdn.net/lazyduck/article/details/100110728