定义
- 域名:串用点分隔的字符是互联网上某台/某组计算机名称。
- 域名系统,可以让我们直接使用域名来使用物联网上对应的服务器
- 例如访问百度搜索服务器
1.直接使用IP地址访问(123.125.115.110)(IP地址比较繁杂,不好记忆)
2.通过百度搜索服务器的域名,首先域名系统会将域名转换为相应的IP地址,通过IP地址访问服务器
例程(通过瑞生网的域名来解析IP地址)
#def ine DN_ Server "www. rat i onmcu. com"// [瑞生网]域名
- 首先将ESP8266设为STA模式,并进行软件定时
void ICACHE_ FLASH_ ATTR user_ init (void)
{
uart_ init(115200, 115200); // 初始化串口波特率
0s_de lay, _us (10000): // 等待串口稳定
// OLED显示初始化
OLED_ Init();// OLED初始化.
OLED_ ShowStr ing (0, 0, "ESP8266-Client"); // ESPB266-CI ient
OLED_ ShowString(0. 2."IP:"):// ESP8266_ IP
OLED_ ShowStr ing (0, 4," rat ionmcu. com"); // www. rat i onmcu. com
OLED_ ShowString(0. 6. "IP:");//服务器.IP
LED_ Init_ JX0);// LED初始化
ESP8266_ STA_ Init_ JXO ;// ESP8266. STA初始化
OS_ Timer_ IP_ Init_ JX(1000. 1);// 1秒重复定时(获取1P地址)
}
- 在定时回调函数中,如果成功获取到IP地址
void ICACHE_ FLASH_ ATTR 0S_ Timer_IP_ cb (void)
{
u8 C_ LED Flash = 0;// LED闪烁计次
struct ip_ info ST_ ESP8266 IP: // ESP8266的IP信息
u8 ESP8266_ IP[4] ;// ESP8266的IP地址
//成功接入WIFI [STA模式下,如果开启DHCP (默认)_则ES08266的 IP地址由WIFI路由器自动分配]
if( wifi_ station. get. connect _status ()=STATI0W_ GOT_ 1P) // 判断是否获取IP
{
wifi_ get_ ip. info (STATION_ IF, &ST ESP8268_ _IP); 1// 获取STA的IP信息
ESP8266_ TP[0] = ST_ ESP8266_ IP. ip. addr:// IP地址高八位= addr低八位
ESP8266_ IP[1] = ST_ ESP8266_ IP. ip. addr>>8;// IP地址次高八位== addr次低八位
ESP8266_ IP[2] = ST_ ESP8266_ IP. ip. addr>>16;// IP地址次低八位== addr 次高八位
ESP8266_ IP[3] = ST _ESP8266_ IP. ip. addr>>24:// IP地址低八位= addr高八位
//显示ESP8266的IP地址
os_ printf ("\nESP8266 IP = %d. %d. %d. %d\n", ESP8266_ 1P[0], ESP8266_ IP[1], ESP8266_ IP[2].ESP8266_ IP[3].);
ESP826OLED_ ShowIP (24. 2, ESP8266_ IP); // OLED显 示ESP8266的IP地址
//接入WIFI成功后,LED快闪3次
for(; C_ LED_ Flash<=5; C LED_ Flash++)
{
GPI0_ OUTPUT_ SET(GPI0_ 1D PIN(4),(C LED _Flash%2)) ;
delay_ ms (100) ;
}
os_ timer. disarm(&0S_ Timer_ IP); // 关闭定时器
ESP8266 NetCon_ Init_ Jx();//初始化网络连接(TCP通信)
}
}
- 在网络连接初始化函数当中
void ICACHE FLASH ATTR ESP8266 NetCon Init JX()
{
//结构体赋值
ST_ NetCon. type = ESPCOWW_ TCP ;//设置为TCP协议
ST_ NetCon. proto. tcp = (esp_ _tcp *) os_ zalloc (sizeof (esp_ tcp)); // 开辟内存
// ESP8266作为TCP_ Client,想要连接TCP. Server,必须知道TCP_ Server 的IP地址
ST. NetCon. preo. top->loca1. port = espconn_ port() ; // 本地端口[获取可用端口]
ST NetCon. proto. tcp->remote port = 80; //自标端口[HTTP端口号80]
//获取域名所对应的IP地址
// [参数1:网络连接结构体指针/参数2:域名字符串指针/参数3: IP地址结构体指针/参数4:回调函数]
espconn_ gethostbyname (&ST_ NetCon, DN Server, &IP_ Server, DNS_ Over_ _Cb_ JX) ;
//注册连接成功回调函数、异常断开回调函数
espconn_ regist_ connectcb (&ST NetCon, ESP8266 TCP. Connect. Cb _JX) ; // 注册TCP连接成功建立的回调函数
espconn_ regist_ r econcb (&ST_ NetCon, ESP8266 TCP_ Break_ _Cb_ _Jx) ;// 注册TCP连接异常断开的回调函数
- 域名解析结束回调函数
DNS域名解析结束_回调函数[参数1:域名字符串指针/参数2: IP地址结构体指针/参数3:网络连接结构体指针]
void ICACHE_ FLASH_ ATTR DNS_ 0ver_ Cb_ JX (const char * name, ip_ addr_ t *ipaddr. void *arg)
{
struct espconn * T. arg = (struct espconn *)arg; // 缓存网络连接结构体指针
if(ipaddr == NULL)//域名解析失败
{
os_ printf("\rn---- DomainName Analyse Failed ---\r\n");
return;
}
else if (ipaddr != NULL & ipaddr->addr != 0//域名解析成功
{
os_ printf ("\r\n---- Doma inName Analyse Succeed --- \r'n"):
IP_ Server. addr = ipaddr->addr;//获取服务器IP地址
//将解析到的服务器IP地址设为TCP连接的远端IP地址
os_ memcpy (T_ arg->proto. tcp->remote_ ip, &IP_ Server. addr, 4); //设置服务器IP地址
//显示[瑞生网]的IP地址
os_ pr intf("\r\nIP Server = %d. %d. %d. %d\r\n",
*((u8*)&IP_ Server. addr),*((u8*)&IP_ Server. addr+1),
*((uB*)&IP_ Server. addr+2) ,*(u8*)&IP_ Server. addr+3)) ;//串口打印.
OLED_ ShowIP(24.6. T_ arg- ->proto. tcp- ->remote_ ip) ;// OLED显示
espconn_ connect(T. arg); //连接TCP-server
}
}
注意事项
当我们串口打印出现以下情况时,说明我们的ESP8266没有连接到网络。
要成功实现此过程,我们需要ESP8266连接我们的路由器,其实没有路由器也是可以的。连接我们的电脑热点即可(此处连接手机热点也可实现我已经尝试过)
点开图中按键即可打开电脑的热点。若是第一次使用可以鼠标右击图中模块。点击设置。
就可以看到此电脑的网络名称和密码了。
完成此操作之后,我们需要将我们找到的网络名称和网络密码写到相应的代码区域内。此次需要我们进行宏定义。
完成此操作之后我们再进行编译下载即可成功。
现象
编译成功之后,我们打开串口助手,复位ESP8266。打开手机热点,即可通过串口助手看到现象。
由ESP8266显示可知。ESP8266的IP地址为192.168.43.13(其实为192.168.43.130)解析到瑞生网的IP地址为182.92.178.10(其实为182.92.178.104)和串口打印的IP地址一致。
ESP8266显示解析成功,这里可以看到瑞生网IP地址为182.92.178.104,并且串口打印ESP8266TCP连接成功。说明我们的ESP8266成功的解析到了瑞生网的IP地址并且成功连接到了瑞生网。
检验
我们来检查一下ESP8266通过域名解析到的IP地址是否正确。我们可以通过电脑上的命令指示符来确定。
由命令指示符上回复可以看到。上面显示的IP地址与我们串口的IP地址相同,说明我们的ESP8266通过域名解析到的IP地址是正确的。
参考连接
https://www.bilibili.com/video/BV1dJ411S723?p=41