当前位置:网站首页>ESP8266 STA_TCP_Server
ESP8266 STA_TCP_Server
2022-07-26 22:44:00 【Paradise_Violet】
目录
前言
8266在STA模式下创建tcp_server
可以参考SDK API参考手册的WiFi接口级tcp/udp章节参考手册
user_init
执行完初始化操作后调用函数将8266设置为sta模式
void ICACHE_FLASH_ATTR user_init(void)
{
uart_init(115200,115200); // 初始化串口波特率
os_delay_us(10000); // 等待串口稳定
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
// OLED显示初始化
//--------------------------------------------------------
OLED_Init(); // OLED初始化
OLED_ShowString(0,0,"ESP8266 = STA"); // ESP8266模式
OLED_ShowString(0,2,"IP:"); // ESP8266_IP地址
OLED_ShowString(0,4,"Remote = STA"); // 远端主机模式
OLED_ShowString(0,6,"IP:"); // 远端主机IP地址
//--------------------------------------------------------
LED_Init_JX(); // LED初始化
ESP8266_STA_Init_JX(); // ESP8266_STA初始化
OS_Timer_1_Init_JX(1000,1); // 1秒定时
}ESP8266_STA初始化
// ESP8266_STA初始化
//==============================================================================
void ICACHE_FLASH_ATTR ESP8266_STA_Init_JX()
{
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.gw,192,168,8,1); // 配置网关地址
IP4_ADDR(&ST_ESP8266_IP.netmask,255,255,255,0); // 配置子网掩码
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
// wifi_station_connect(); // ESP8266连接WIFI
}软件定时的回调函数
// 软件定时的回调函数
//=========================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_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(默认),则ESO8266的IP地址由WIFI路由器自动分配】
//-------------------------------------------------------------------------------------
if( wifi_station_get_connect_status() == STATION_GOT_IP ) // 判断是否获取IP
{
wifi_get_ip_info(STATION_IF,&ST_ESP8266_IP); // 获取STA的IP信息
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高八位
// 显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
os_printf("ESP8266_IP = %d.%d.%d.%d\n",ESP8266_IP[0],ESP8266_IP[1],ESP8266_IP[2],ESP8266_IP[3]);
OLED_ShowIP(24,2,ESP8266_IP); // OLED显示ESP8266的IP地址
//-----------------------------------------------------------------------------------------------
// 接入WIFI成功后,LED快闪3次
//----------------------------------------------------
for(; C_LED_Flash<=5; C_LED_Flash++)
{
GPIO_OUTPUT_SET(GPIO_ID_PIN(4),(C_LED_Flash%2));
delay_ms(100);
}
os_timer_disarm(&OS_Timer_1); // 关闭定时器
ESP8266_NetCon_Init_JX(); // 初始化网络连接(TCP通信)
}
}初始化网络连接(TCP通信)
// 初始化网络连接(TCP通信)
//=========================================================================================================
void ICACHE_FLASH_ATTR ESP8266_NetCon_Init_JX()
{
// 结构体赋值
//--------------------------------------------------------------------------
ST_NetCon.type = ESPCONN_TCP ; // 设置为TCP协议
ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); // 开辟内存
// 此处无需设置目标IP/端口(ESP8266作为Server,不需要预先知道Client的IP/端口)
//--------------------------------------------------------------------------
ST_NetCon.proto.tcp->local_port = 8266 ; // 设置本地端口
//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] = 8;
//ST_NetCon.proto.tcp->remote_ip[3] = 47;
// 注册连接成功回调函数、异常断开回调函数
//--------------------------------------------------------------------------------------------------
espconn_regist_connectcb(&ST_NetCon, ESP8266_TCP_Connect_Cb_JX); // 注册TCP连接成功建立的回调函数
espconn_regist_reconcb(&ST_NetCon, ESP8266_TCP_Break_Cb_JX); // 注册TCP连接异常断开的回调函数
// 创建TCP_server,建立侦听
//----------------------------------------------------------
espconn_accept(&ST_NetCon); // 创建TCP_server,建立侦听
espconn_regist_time(&ST_NetCon,300, 0); //设置超时断开时间。单位=秒,最大值=7200
}成功接收网络数据的回调函数
// 成功接收网络数据的回调函数【参数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; // 缓存网络连接结构体指针
// 根据数据设置LED的亮/灭
//-------------------------------------------------------------------------------
if(pdata[0] == 'k' || pdata[0] == 'K') LED_ON; // 首字母为'k'/'K',灯亮
else if(pdata[0] == 'g' || pdata[0] == 'G') LED_OFF; // 首字母为'g'/'G',灯灭
os_printf("\nESP8266_Receive_Data = %s\n",pdata); // 串口打印接收到的数据
/*
// 获取远端信息
//------------------------------------------------------------------------------------
remot_info * P_port_info = NULL; // 定义远端连接信息指针
if(espconn_get_connection_info(T_arg, &P_port_info, 0)==ESPCONN_OK) // 获取远端信息
{
T_arg->proto.tcp->remote_port = P_port_info->remote_port; // 获取对方端口号
T_arg->proto.tcp->remote_ip[0] = P_port_info->remote_ip[0]; // 获取对方的IP地址
T_arg->proto.tcp->remote_ip[1] = P_port_info->remote_ip[1];
T_arg->proto.tcp->remote_ip[2] = P_port_info->remote_ip[2];
T_arg->proto.tcp->remote_ip[3] = P_port_info->remote_ip[3];
//os_memcpy(T_arg->proto.tcp->remote_ip,P_port_info->remote_ip,4); // 内存拷贝
}
*/
//--------------------------------------------------------------------
OLED_ShowIP(24,6,T_arg->proto.tcp->remote_ip); // 显示远端主机IP地址
//--------------------------------------------------------------------
//【TCP通信是面向连接的,向远端主机回应时可直接使用T_arg结构体指针指向的IP信息】
//-----------------------------------------------------------------------------------------------
espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK")); // 向对方发送应答
}8266成功接入到无线路由器创建的WiFi局域网中,并且8266成功的建立了tcp_server

边栏推荐
猜你喜欢

Spark ---- shuffle and partition of RDD

Choose RTMP or RTC protocol for mobile live broadcast

Applet live broadcast, online live broadcast, live broadcast reward: Tencent cloud mobile live broadcast component mlvb multi scene live broadcast expansion

Create MDK project
#问题反馈 手机 app 同步失败:数据仓库外部变更损坏 ipad app 也是一打开就下载仓库,然后闪退
![数学建模简介-从现实对象到数学建模[2]](/img/b5/595a4e9a9a59ab57f541d3e21fba49.jpg)
数学建模简介-从现实对象到数学建模[2]

Come on: encourage college graduates to return home to start businesses and employment, and help rural revitalization

Small programs related to a large number of digital collections off the shelves of wechat: is NFT products the future or a trap?
![【unity】Unity界面scene视图[1]](/img/5a/c34ff09ef1ddba4b65c7873775c251.png)
【unity】Unity界面scene视图[1]

Website log collection and analysis process
随机推荐
Unity Twitter登录接入
Spark accumulator
以赛促练-力扣第303场周赛反思
Verilog过程赋值语句
MySQL关闭连接事务自动提交的问题
Jenkins--基础--02--安装
快来:鼓励高校毕业生返乡创业就业,助力乡村振兴
Keil开发环境的搭建送安装包
Unity UGUI Text文本框自适应
SQL关系代数——除法
RS485信号的测量
Unity CharacterController
MySQL字符集设置为UTF-8,但控制台仍然出现中文乱码问题
The MySQL character set is set to UTF-8, but the console still has the problem of Chinese garbled code
Li Hongyi machine learning (2017 Edition)_ P3-4: Regression
5. Legal bracket string
Unity ugui text text box adaptation
Play guest cloud with zerotier nanny level teaching to ensure learning waste
Promoting practice with competition - Reflection on the 303th weekly match
Square root of X