请选择 进入手机版 | 继续访问电脑版
论坛
登录 | 立即注册 设为首页收藏本站 切换到宽版
查看: 246|回复: 3

ESP8266_10工作模式之STATION模式

[复制链接]

19

主题

38

帖子

129

积分

注册会员

Rank: 2

积分
129
发表于 6 天前 | 显示全部楼层 |阅读模式
本帖最后由 lazyduck 于 2019-12-2 13:36 编辑

从这一节开始,聊聊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工程的源码,里面有相关的代码,可直接使用。现在版本下已经没有这个工程了,所以我这里直接放出源码,大家会用即可。
  1. void ICACHE_FLASH_ATTR scan_done(void *arg,STATUS status)
  2. {
  3.          uint8 ssid[33];
  4.          struct station_config stationConf;
  5.            if (status == OK)
  6.            {
  7.              struct bss_info *bss_link = (struct bss_info *)arg;
  8.              while (bss_link != NULL)
  9.              {
  10.                os_memset(ssid, 0, 33);
  11.                if (os_strlen(bss_link->ssid) <= 32)
  12.                {
  13.                  os_memcpy(ssid, bss_link->ssid, os_strlen(bss_link->ssid));
  14.                }
  15.                else
  16.                {
  17.                  os_memcpy(ssid, bss_link->ssid, 32);
  18.                }
  19.                os_printf("+CWLAP:(%d,"%s",%d,""MACSTR"",%d)\r\n",
  20.                           bss_link->authmode, ssid, bss_link->rssi,
  21.                           MAC2STR(bss_link->bssid),bss_link->channel);
  22.                bss_link = bss_link->next.stqe_next;
  23.              }
  24.              os_memcpy(&stationConf.ssid, " shatanliu", 32);
  25.              os_memcpy(&stationConf.password, "11223344", 64);
  26.              wifi_station_set_config_current(&stationConf);
  27.              wifi_station_connect();
  28.              os_timer_setfn(&connect_timer,Wifi_conned,NULL);
  29.              os_timer_arm(&connect_timer,2000,1);
  30.            }
  31.            else
  32.            {
  33.            }
  34. }
复制代码
注意事项:
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();
返回值如下:
回复

使用道具 举报

19

主题

38

帖子

129

积分

注册会员

Rank: 2

积分
129
 楼主| 发表于 6 天前 | 显示全部楼层
  1. enum{

  2. STATION_IDLE = 0,

  3. STATION_CONNECTING,

  4. STATION_WRONG_PASSWORD,

  5. STATION_NO_AP_FOUND,

  6. STATION_CONNECT_FAIL,

  7. STATION_GOT_IP

  8. };
复制代码

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

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

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

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

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

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

使用道具 举报

1

主题

96

帖子

498

积分

中级会员

Rank: 3Rank: 3

积分
498
发表于 6 天前 | 显示全部楼层
我猜楼主后面的文章将会是:智能链接、tcp、udp
回复

使用道具 举报

19

主题

38

帖子

129

积分

注册会员

Rank: 2

积分
129
 楼主| 发表于 5 天前 | 显示全部楼层
abcrazy 发表于 2019-12-2 21:18
我猜楼主后面的文章将会是:智能链接、tcp、udp

你猜 你猜的对不对~~~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|安信可论坛    

GMT+8, 2019-12-8 01:48 , Processed in 0.030145 second(s), 14 queries , Redis On.

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表