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
}
?
// 查询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]);
?
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
}
?
?
//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");
}
?
// 成功发送网络数据的回调函数
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");
}
?