1、初始化ESP8266_STA模式 

void ICACHE_FLASH_ATTR ESP8266_STA_Init()
{
	struct station_config STA_Config;	// STA参数结构体

	struct ip_info ST_ESP8266_IP;		// STA信息结构体

	// 设置ESP8266的工作模式
	//------------------------------------------------------------------------
	wifi_set_opmode(0x01);				// 设置为STA模式,并保存到Flash

	/*
	// 设置STA模式下的IP地址【ESP8266默认开启DHCP Client,接入WIFI时会自动分配IP地址】
	//--------------------------------------------------------------------------------
	wifi_station_dhcpc_stop();						// 关闭 DHCP Client
	IP4_ADDR(&ST_ESP8266_IP.ip,192,168,8,88);		// 配置IP地址
	IP4_ADDR(&ST_ESP8266_IP.netmask,255,255,255,0);	// 配置子网掩码
	IP4_ADDR(&ST_ESP8266_IP.gw,192,168,8,1);		// 配置网关地址
	wifi_set_ip_info(STATION_IF,&ST_ESP8266_IP);	// 设置STA模式下的IP地址
	*/

	// 结构体赋值,配置STA模式参数
	//-------------------------------------------------------------------------------
	os_memset(&STA_Config, 0, sizeof(struct station_config));	// STA参数结构体 = 0
	os_strcpy(STA_Config.ssid,ESP8266_STA_SSID);				// 设置WIFI名
	os_strcpy(STA_Config.password,ESP8266_STA_PASS);			// 设置WIFI密码

	wifi_station_set_config(&STA_Config);	// 设置STA参数,并保存到Flash


	// 此API不能在user_init初始化中调用
	// 如果user_init中调用wifi_station_set_config(...)的话,内核会自动将ESP8266接入WIFI
	//----------------------------------------------------------------------------------
	// wifi_station_connect();		// ESP8266连接WIFI
}

ESP8266 STA esp8266 sta ip地址_IP

 

2、 STA模式信息获取:

// 查询STA接入WIFI状态
//-----------------------------------------------------
S_WIFI_STA_Connect = wifi_station_get_connect_status();
//---------------------------------------------------
// Station连接状态表
// 0 == STATION_IDLE -------------- STATION闲置
// 1 == STATION_CONNECTING -------- 正在连接WIFI
// 2 == STATION_WRONG_PASSWORD ---- WIFI密码错误
// 3 == STATION_NO_AP_FOUND ------- 未发现指定WIFI
// 4 == STATION_CONNECT_FAIL ------ 连接失败
// 5 == STATION_GOT_IP ------------ 获得IP,连接成功
//---------------------------------------------------

switch(S_WIFI_STA_Connect)
{
	case 0 : 	os_printf("\nSTATION_IDLE\n");				break;
	case 1 : 	os_printf("\nSTATION_CONNECTING\n");		break;
	case 2 : 	os_printf("\nSTATION_WRONG_PASSWORD\n");	break;
	case 3 : 	os_printf("\nSTATION_NO_AP_FOUND\n");		break;
	case 4 : 	os_printf("\nSTATION_CONNECT_FAIL\n");		break;
	case 5 : 	os_printf("\nSTATION_GOT_IP\n");			break;
}

// 获取ESP8266_Station模式下的IP地址
// DHCP-Client默认开启,ESP8266接入WIFI后,由路由器分配IP地址,IP地址不确定
wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP);	// 参数2:IP信息结构体指针

// ESP8266_AP_IP.ip.addr是32位二进制代码,转换为点分十进制形式
ESP8266_IP[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高八位
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);

ESP8266 STA esp8266 sta ip地址_ESP8266 STA_02

ESP8266 STA esp8266 sta ip地址_ESP8266 STA_03

ESP8266 STA esp8266 sta ip地址_TCP_04

 

3、初始化网络连接(TCP通信)

void ICACHE_FLASH_ATTR ESP8266_NetCon_Init()
{
	// 结构体赋值
	//--------------------------------------------------------------------------
	ST_NetCon.type = ESPCONN_TCP ;				// 通信协议:TCP

	ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));	// 申请内存
        //ESP8266作为Server时,不需要设置Client的IP/端口
	ST_NetCon.proto.tcp->local_port = 8800 ;	// 设置本地端口
        /*
	ST_NetCon.proto.tcp->remote_port = 8888;	// 设置目标端口
	ST_NetCon.proto.tcp->remote_ip[0] = 192;	// 设置目标IP地址
	ST_NetCon.proto.tcp->remote_ip[1] = 168;
	ST_NetCon.proto.tcp->remote_ip[2] = 4;
	ST_NetCon.proto.tcp->remote_ip[3] = 2;
        */
	// 注册连接成功回调函数、异常断开回调函数
	espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb);	// 注册TCP连接成功建立的回调函数
	espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb);		// 注册TCP连接异常断开的回调函数

	espconn_accept(&ST_NetCon);	// 创建TCP_server,建立侦听

	// 请在 espconn_accept 之后,连接未建立之前,调用本接口
	// 如果超时时间设置为 0,ESP8266_TCP_server将始终不会断开已经不与它通信的TCP_client,不建议这样使用。
        //作为 TCP Client 时不需要
	espconn_regist_time(&ST_NetCon, 300, 0); 	//设置超时断开时间。单位=秒,最大值=7200
}

ESP8266 STA esp8266 sta ip地址_IP_05

ESP8266 STA esp8266 sta ip地址_ESP8266 STA_06

 

ESP8266 STA esp8266 sta ip地址_TCP_07

ESP8266 STA esp8266 sta ip地址_回调函数_08

 

4、TCP连接建立成功 or 失败

//TCP连接建立成功的回调函数 
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb_JX(void *arg)
{
	espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb);	// 注册网络数据发送成功的回调函数
	espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb);	// 注册网络数据接收成功的回调函数
	espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb);// 注册成功断开TCP连接的回调函数
	os_printf("\n--------------- ESP8266_TCP_Connect_OK ---------------\n");
}


//TCP连接异常断开时的回调函数
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err)
{
    os_printf("\nESP8266_TCP_Break\n");
}

ESP8266 STA esp8266 sta ip地址_ESP8266 STA_09

ESP8266 STA esp8266 sta ip地址_TCP_10

ESP8266 STA esp8266 sta ip地址_TCP_11

 

5、数据发送 or 接收

// 成功发送网络数据的回调函数
void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_Cb_JX(void *arg)
{
	os_printf("\nESP8266_WIFI_Send_OK\n");
}

// 成功接收网络数据的回调函数【参数1:网络传输结构体espconn指针、参数2:网络传输数据指针、参数3:数据长度】
void ICACHE_FLASH_ATTR ESP8266_WIFI_Recv_Cb_JX(void * arg, char * pdata, unsigned short len)
{
	struct espconn * T_arg = arg;		// 缓存网络连接结构体指针

	os_printf("\nESP8266_Receive_Data = %s\n",pdata);		// 串口打印接收到的数据

	//【TCP通信是面向连接的,向远端主机回应时可直接使用T_arg结构体指针指向的IP信息】
	espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK"));	// 向对方发送应答
}

// TCP连接断开成功的回调函数
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb_JX(void *arg)
{
	os_printf("\nESP8266_TCP_Disconnect_OK\n");
}

ESP8266 STA esp8266 sta ip地址_IP_12

ESP8266 STA esp8266 sta ip地址_TCP_13