1、AP、STA的含义
AP:Access Point,访问接入点,终端设备通过访问接入点接入网络,ESP8266在AP模式相当于创建了一个WiFi局域网;
STA:Station,站点,就是所谓的终端设备,ESP8266在STA模式是作为终端设备接入另一个WiFi;
2、设置ESP8266为STA模式
像手机、笔记本一样,接入WiFi,起码要知道WiFi名和密码;
还要配置IP地址、子网掩码、默认网关,不过默认启动DHCP可以自动获取IP等;
2.1、使能STA模式、配置WiFi名和密码
#define ESP8266_STA_SSID "402"
#define ESP8266_STA_PASS "abc123456"
//初始化STA模式,设置WiFi名和密码
void ICACHE_FLASH_ATTR STA_mode_init()
{
struct station_config sta_cfg;
os_memset(&sta_cfg, 0, sizeof(struct station_config)); // 结构体清0
wifi_set_opmode(0x01); // 设置为STA模式,并保存到Flash
os_strcpy(sta_cfg.ssid,ESP8266_STA_SSID); // 设置SSID(将字符串复制到ssid数组)
os_strcpy(sta_cfg.password,ESP8266_STA_PASS); // 设置密码(将字符串复制到password数组)
sta_cfg.bssid_set = 0;
wifi_station_set_config(&sta_cfg); //设置STA模式
}
2.2、初始化TCP通信
UDP、TCP的内容前篇已经介绍过,AP或STA模式与其无关,这里把ESP8266当做TCP的服务器端,注意,要在连接完WiFi之后再初始化TCP通信,可通过wifi_station_get_connect_status函数获取连接状态;
os_timer_t timer_wifi_check; //检测wifi连接成功的定时器
//检测wifi连接成功的定时器
void timer_wifi_check_callback()
{
struct ip_info IP_info;
u8 ip_dec[4];
u8 buffer[20];
if( wifi_station_get_connect_status() == STATION_GOT_IP ){ // 判断连接状态,是否获取IP
wifi_get_ip_info(STATION_IF,&IP_info);
//32位二进制IP地址,将它转换为点分十进制的形式
ip_dec[0] = IP_info.ip.addr;
ip_dec[1] = IP_info.ip.addr>>8;
ip_dec[2] = IP_info.ip.addr>>16;
ip_dec[3] = IP_info.ip.addr>>24;
// 打印ESP8266的IP地址
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ip_dec[0],ip_dec[1],ip_dec[2],ip_dec[3]);
os_sprintf(buffer,"IP:%d.%d.%d.%d",ip_dec[0],ip_dec[1],ip_dec[2],ip_dec[3]);
oled_show_string(0,0,buffer,FONT_8x16);
//初始化TCP
TCP_port8266_init();
//关闭定时器
os_timer_disarm(&timer_wifi_check);
}else{ //等待WiFi连接
os_printf("connecting wifi ......\n");
}
}
void ICACHE_FLASH_ATTR timer_init()
{
os_timer_disarm(&timer_wifi_check);
os_timer_setfn(&timer_wifi_check,timer_wifi_check_callback,NULL);
os_timer_arm(&timer_wifi_check,1000,1); //1s
}
3、下载、验证
在得知了ESP8266的IP之后,加上程序中写好的端口号,网络调试助手就作为客户端连接服务器,并发送数据了;
作为服务器,当收到数据后你也可以加两行代码打印客户端的IP和端口,知道是谁给你发的;
void ICACHE_FLASH_ATTR TCP_recv_callback(void * arg, char * pdata, unsigned short len)
{
struct espconn * T_arg = arg; // 缓存网络连接结构体指针
u8 client_ip[4];
os_printf("\nESP8266_Receive_Data = %s\n",pdata); // 串口打印接收到的数据
os_memcpy(client_ip,T_arg->proto.tcp->remote_ip,4);
os_printf("client ip:%d.%d.%d.%d,port:%d\n",client_ip[0],client_ip[1],client_ip[2],client_ip[3],T_arg->proto.tcp->remote_port);
// 向对方发送应答
espconn_send(T_arg,"ESP8266_TCP_Recv_OK",os_strlen("ESP8266_TCP_Recv_OK"));
}