我因为想搞一个自动浇花器,但不想专门去查看浇花器的数据,所以准备用另一个esp32搭建一个web服务器用来显示浇花器的数据,并且也可以方便我统一管理以后可能制作的其他设备。
在这之中最重要的就是访问ip,虽说每次链接wifi时路由器都会为我们的设备分配一个动态ip但这种ip并不适用于搭建服务器,因为每次服务器接入wifi后都会获得一个不同的ip,这使得其他想要访问服务器的设备也需要跟着更改访问的ip地址,这会要求我们在服务器每次接入wifi后都要手动设置其他设备的访问地址,万一哪天因为跳闸或者意外导致服务器重连wifi,而我们没发现的话就成了一个bug,所以为了一劳永逸我在服务器程序里为服务器设置了静态ip。
这就用到了wifi库的config(local_ip,gateway,subnet)函数来配置静态ip,这个函数有三个参数分别是
- local_ip:静态ip地址(你想设置的服务器ip)
- gateway:路由器ip(笨方法去翻路由器的背面)
- subnet:子网掩码
#include <wifi.h>
const char *ID = "**";//wifi名称
const char *moss = "********";//WiFi密码
IPAddress IP_router,/*路由器IP存储*/
IP_mask,/*子网掩码存储*/
IP_static;/*静态IP存储*/
void setup{
WiFi.config(IP_static,IP_router,IP_mask);
WiFi.begin(ID,moss);
}
这就是这个函数的最简单的应用,不过要注意的是
- 设置静态ip要在wifi链接前即wifi.begin();前调用。
- 设置静态ip时esp32链接wifi模式要为WIFI_STA模式,虽然wifi.begin()时会默认设置为WIFI_STA模式(如果在wifi初始化前没有单独设置的话)。
其实仅用这些就已经基本满足我对服务器的需求了,但考虑到以后可能换路由器或者换生活环境导致我要在程序中重新设置路由器ip和子网掩码,到那时候我原本的程序可能已经找不到了(其实就是懒得改完之后再烧录一遍了),所以我想到在程序中添加一个代码让esp32链接到wifi后直接获取这个wifi的路由器的ip和子网掩码。
#include <wifi.h>
const char *ID = "**";//wifi名称
const char *moss = "********";//WiFi密码
IPAddress IP_router,/*路由器IP存储*/
IP_mask,/*子网掩码存储*/
IP_static;/*静态IP存储*/
void setup{
WiFi.config(IP_static,IP_router,IP_mask);
WiFi.begin(ID,moss);
IP_static=IP_mask=IP_router=WiFi.gatewayIP();//获取路由器ip
WiFi.subnetMask();//获取子网掩码
IP_static[3]=100;//设置静态IP
}
但前面说过config()要在begin()前用,而路由器ip和子网掩码只能在wifi链接后获取,这就造成了一点冲突所以程序就被我改成了这样
#include <wifi.h>
const char *ID = "**";//wifi名称
const char *moss = "********";//WiFi密码
IPAddress IP_router,/*路由器IP存储*/
IP_mask,/*子网掩码存储*/
IP_static;/*静态IP存储*/
void setup{
WiFi.begin(ID,moss);
IP_static=IP_router=WiFi.gatewayIP();//获取路由器ip
IP_mask=WiFi.subnetMask();//获取子网掩码
IP_static[3]=100;//设置静态IP
WiFi.disconnect(false);
WiFi.config(IP_static,IP_router,IP_mask);
WiFi.begin(ID, moss);
}
先连接wifi获取路由器ip和子网掩码后断开链接设置完静态ip后再重连,这样我就可以一劳永逸了。
用到的函数
- WiFi.begin(id,moss);链接wifi(第一个参数是wifi名,第二个参数是wifi密码)
- WiFi.gatewayIP();用于获取所链接wifi的路由器的ip
- WiFi.subnetMask();用于获取所连接的wifi的子网掩码
- WiFi.disconnect(true/false);断开链接(true:断开链接的同时退出STA模式;false:断开链接但不退出STA模式)
- WiFi.config(local_ip,gateway,subnet);配置静态ip(第一个参数:静态ip地址;第二个参数:路由器ip;第三个参数:子网掩码)(配置后要重新调用WiFi.begin(id,moss);使其生效)