当前位置:网站首页>ESP8266 AP_TCP_Server
ESP8266 AP_TCP_Server
2022-07-26 22:44:00 【Paradise_Violet】
目录
在user_init当中执行完初始化后,将ESP8266_AP模式,之后1s钟重复定时
在定时回调函数当中,查询AP模式下ESP8266的IP地址,ESP8266成功获取到IP地址后,关闭定时器,初始化网络连接(TCP通信)
前言
8266在ap模式下创建tcp server
在user_init当中执行完初始化后,将ESP8266_AP模式,之后1s钟重复定时
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 = AP"); // 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_AP_Init_JX(); // 初始化ESP8266_AP模式
OS_Timer_1_Init_JX(1000,1); // 1秒定时(重复)
}在定时回调函数当中,查询AP模式下ESP8266的IP地址,ESP8266成功获取到IP地址后,关闭定时器,初始化网络连接(TCP通信)
// 软件定时的回调函数
//=============================================================================================================
void ICACHE_FLASH_ATTR OS_Timer_1_cb(void)
{
struct ip_info ST_ESP8266_IP; // IP信息结构体
u8 ESP8266_IP[4]; // 点分十进制形式保存IP
wifi_get_ip_info(SOFTAP_IF,&ST_ESP8266_IP); // 查询AP模式下ESP8266的IP地址
if(ST_ESP8266_IP.ip.addr != 0 ) // ESP8266成功获取到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地址
//-----------------------------------------------------------------------------------------------
os_timer_disarm(&OS_Timer_1); // 关闭定时器
ESP8266_NetCon_Init_JX(); // 初始化网络连接(TCP通信)
}
}在初始化网络连接中(TCP通信)
结构体赋值,将通信协议设置为TCP,并且为TCP结构体申请内存,之后注册连接成功回调函数、异常断开回调函数,之后创建TCP_server,建立侦听,设置超时断开时间
// 初始化网络连接(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] = 4;
//ST_NetCon.proto.tcp->remote_ip[3] = 2;
// 注册连接成功回调函数、异常断开回调函数
//--------------------------------------------------------------------------------------------------
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_accept 之后,连接未建立之前,调用本接口
// 如果超时时间设置为 0,ESP8266_TCP_server将始终不会断开已经不与它通信的TCP_client,不建议这样使用。
//---------------------------------------------------------------------------------------------------
espconn_regist_time(&ST_NetCon, 300, 0); //设置超时断开时间。单位=秒,最大值=7200
}espconn_regist_time(&ST_NetCon, 300, 0); //设置超时断开时间。单位=秒,最大值=7200
参数一是网络连接结构体指针,参数二是超时时间单位是秒,参数三表示是否是全部tcp连接,还是仅是当前tcp连接,这里需要注意如果超时时间设置为 0,ESP8266_TCP_server将始终不会断开已经不与它通信的TCP_client,不建议这样使用。
当我们成功的创建了server之后,我们8266就在等待tcp_client向他发起tcp连接
如果tcp连接成功建立的话,会进入ESP8266_TCP_Connect_Cb_JX(void *arg)这个回调函数,它的参数就是网络连接结构体指针是(void*) 型,需要把它强制站换成网络连接结构体指针(struct espconn *)型
// TCP连接建立成功的回调函数
//====================================================================================================================
void ICACHE_FLASH_ATTR ESP8266_TCP_Connect_Cb_JX(void *arg)
{
espconn_regist_sentcb((struct espconn *)arg, ESP8266_WIFI_Send_Cb_JX); // 注册网络数据发送成功的回调函数
espconn_regist_recvcb((struct espconn *)arg, ESP8266_WIFI_Recv_Cb_JX); // 注册网络数据接收成功的回调函数
espconn_regist_disconcb((struct espconn *)arg,ESP8266_TCP_Disconnect_Cb_JX); // 注册成功断开TCP连接的回调函数
os_printf("\n--------------- ESP8266_TCP_Connect_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; // 缓存网络连接结构体指针
// 根据数据设置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")); // 向对方发送应答
}TCP通信是面向连接的,向远端主机回应时可直接使用T_arg结构体指针指向的IP信息
espconn_send(T_arg,"ESP8266_WIFI_Recv_OK",os_strlen("ESP8266_WIFI_Recv_OK")); 向对方发送应答
成功发送网络数据的回调函数
void ICACHE_FLASH_ATTR ESP8266_WIFI_Send_Cb_JX(void *arg)
{
os_printf("\nESP8266_WIFI_Send_OK\n");
}TCP连接断开成功的回调函数
void ICACHE_FLASH_ATTR ESP8266_TCP_Disconnect_Cb_JX(void *arg)
{
os_printf("\nESP8266_TCP_Disconnect_OK\n");
}TCP连接异常断开时的回调函数
void ICACHE_FLASH_ATTR ESP8266_TCP_Break_Cb_JX(void *arg,sint8 err)
{
os_printf("\nESP8266_TCP_Break\n");
}

发送K,led点亮并且8266成功接收到字符K,并且成功地向tcp_client应答
说明我们的tcp通信设置已经设置成功了,并且8266也成功地创建了tcp_server, 网络调试助手作为tcp_client已经成功地和8266建立了tcp连接,并且双方进行了通信。
边栏推荐
猜你喜欢

下一代互联网:视联网

链表常规OJ

Mqtt---- bottom (precautions)

Unity line access

Surrounded area

The setup of KEIL development environment is delivered to the installation package

Jenkins -- Basic -- 5.2 -- system configuration -- system configuration

Doris or starrocks JMeter pressure measurement

4. Root user login
![数学建模简介-从现实对象到数学建模[2]](/img/b5/595a4e9a9a59ab57f541d3e21fba49.jpg)
数学建模简介-从现实对象到数学建模[2]
随机推荐
SQL关系代数——除法
【无标题】
Markdown grammar learning summary
Li Kou brushes 300 record posts
Unity twitter login access
Come and help you understand the Internet of things in three minutes
深度学习笔记
Next generation Internet: Video Networking
无重复字符的最长子串
Li Hongyi machine learning (2017 Edition)_ P21: convolutional neural network CNN
MySQL closes the problem of automatic submission of connection transactions
Unity常用的一些简易扩展方法
2. 错误的里程表
markdown
大四老学长的自我批评记录
Are you ready for the Internet of things to revolutionize manufacturing?
Jenkins -- Basic -- 5.3 -- system configuration -- global security configuration
markdown
Verilog的基本语法
SQL learning (3) -- complex query and function operation of tables