当前位置:网站首页>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连接,并且双方进行了通信。
边栏推荐
- 7. Formula F1 champion
- SQL learning (3) -- complex query and function operation of tables
- Jenkins -- Basic -- 5.3 -- system configuration -- global security configuration
- What is the digital economy and how does it change the business model?
- Solve the problem that CUDA cannot accelerate GPU in pytoch
- c语言实现动态顺序表的增删查改
- SQL relational algebra - Division
- 数学建模简介-从现实对象到数学建模[2]
- 5. Xshell connection server denied access, password error
- Remember that the scene rendered by rawimage is disordered once
猜你喜欢

Play guest cloud with zerotier nanny level teaching to ensure learning waste

Come and help you understand the mobile Internet in a minute

报错信息 WARNING: IPv4 forwarding is disabled. Networking will not work.

4. Root user login

SQL learning (2) -- basic query and sorting of tables

集中式版本控制工具代码合并问题

最长公共子串

MQTT协议------上

Li Hongyi machine learning (2017 Edition)_ P13: deep learning

Six ways for the Internet of things to improve our lives
随机推荐
3. 拳王阿里
Li Hongyi machine learning (2021 Edition)_ P5-6: small gradient processing
ESP8266接入云平台------DNS 域名连接服务器
Unity screenshot widget
#快捷键介绍
MQTT----下(注意事项)
MQTT协议------上
Jenkins--基础--5.2--系统配置--系统配置
Jenkins -- Basic -- 5.2 -- system configuration -- system configuration
c语言实现动态顺序表的增删查改
Unity 使用NavMesh实现简易的摇杆功能
Come and help you understand the mobile Internet in a minute
ESP8266 STA_UDP_Client
Square root of X
07 - setup and attack of log server
MySQL closes the problem of automatic submission of connection transactions
非递归前中后序遍历二叉树
Database interim (II)
RS485信号的测量
6. The world cup is coming