1、整体流程
- ESP8266设置成AP模式,笔记本连上此WLAN;
- 作为TCP服务器端,配置好本地端口8266,等待客户端建立TCP连接(并设置60s keep alive);
- 侦听到客户端发来的TCP连接建立请求,如果能够成功建立TCP连接,则进入等待数据的阶段;
- 收到TCP数据,向客户端发送响应;
- 如果60s之内没有收到TCP数据,则主动断开TCP连接;
- 后续客户端仍可以重新建立TCP连接;
2、配置TCP通信
- 配置struct espconn:TCP协议,设置本地端口8266;
- 建立TCP连接后的回调函数;(发送、接收数据报的回调、TCP正常断开的回调)
- TCP异常断开后的回调函数;(打印异常断开的原因)
- espconn_accept 建立TCP连接侦听;
- 建立连接后60内没有数据,自动断开TCP连接;
//初始化TCP通信,端口8266;
void ICACHE_FLASH_ATTR TCP_port8266_init()
{
ST_NetCon.type = ESPCONN_TCP; //通信协议:TCP
ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));// 申请内存
ST_NetCon.proto.tcp->local_port = 8266 ; // 设置本地端口
espconn_regist_connectcb(&ST_NetCon,TCP_connect_callback); //建立TCP连接后回调
espconn_regist_reconcb(&ST_NetCon,TCP_reconncect_callback); //TCP异常断开连接
espconn_accept(&ST_NetCon); //初始化TCP通信
//espconn_regist_time在espconn_accept之后调用
espconn_regist_time(&ST_NetCon,60,0); //60s没收到数据,断开连接
}
- ?建立TCP连接后的回调函数
- 发送、接收数据报的回调函数
- TCP正常断开的回调函数
//建立了TCP连接,设置发送、接收数据回调、断开连接回调
void ICACHE_FLASH_ATTR TCP_connect_callback(void *arg)
{
os_printf("TCP connect.\n");
espconn_regist_sentcb((struct espconn*)(arg),TCP_send_callback); // 注册网络数据发送成功的回调函数
espconn_regist_recvcb((struct espconn*)(arg),TCP_recv_callback); // 注册网络数据接收成功的回调函数
espconn_regist_disconcb((struct espconn*)(arg),TCP_discon_callback); //TCP连接正常,断开连接的回调函数
}
//正常断开TCP连接
void ICACHE_FLASH_ATTR TCP_discon_callback()
{
os_printf("TCP normal disconnect\n");
}
void ICACHE_FLASH_ATTR TCP_send_callback(void *arg)
{
os_printf("TCP seriver send over\n");
}
//作为服务器收到客户端TCP报文的回调函数
void ICACHE_FLASH_ATTR TCP_recv_callback(void * arg, char * pdata, unsigned short len)
{
struct espconn * T_arg = arg; // 缓存网络连接结构体指针
os_printf("\nESP8266_Receive_Data = %s\n",pdata); // 串口打印接收到的数据
// 向对方发送应答
espconn_send(T_arg,"ESP8266_TCP_Recv_OK",os_strlen("ESP8266_TCP_Recv_OK"));
}
TCP异常断开的回调函数
//异常断开TCP连接
void ICACHE_FLASH_ATTR TCP_reconncect_callback(void *arg,sint8 er)
{
switch(er){ //输出下TCP异常断开的原因
case ESPCONN_TIMEOUT: os_printf("ESPCONN_TIMEOUT\n"); break; //超时
case ESPCONN_ABRT: os_printf("ESPCONN_ABRT\n"); break; //TCP连接异常
case ESPCONN_RST: os_printf("ESPCONN_RST\n"); break; //连接复位断开
case ESPCONN_CLSD: os_printf("ESPCONN_CLSD\n"); break; //TCP 连接在断开过程中出错,异常断开
case ESPCONN_CONN: os_printf(" ESPCONN_CONN\n"); break; //TCP未连接成功
default: os_printf("else tcp error\n"); break;
}
}
3、下载、验证
?
4、ESP8266作为客户端
ESP8266作为客户端,要给出服务器的IP和端口,并调用espconn_connect 主动与其建立连接;
//初始化TCP通信,端口8266;
void ICACHE_FLASH_ATTR TCP_port8266_init()
{
ST_NetCon.type = ESPCONN_TCP; //通信协议:TCP
ST_NetCon.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp)); // 申请内存
//ST_NetCon.proto.udp->local_port = espconn_port(); //获取8266可用端口,这是动态的端口
ST_NetCon.proto.tcp->local_port = 8266 ; // 设置本地端口
ST_NetCon.proto.tcp->remote_ip[0] = 192;
ST_NetCon.proto.tcp->remote_ip[1] = 168;
ST_NetCon.proto.tcp->remote_ip[2] = 4;
ST_NetCon.proto.tcp->remote_ip[3] = 2;
ST_NetCon.proto.tcp->remote_port = 6666;
espconn_regist_connectcb(&ST_NetCon,TCP_connect_callback); //建立TCP连接后回调
espconn_regist_reconcb(&ST_NetCon,TCP_reconncect_callback); //TCP异常断开连接
//ESP8266作为客户端,是向服务器申请TCP连接
espconn_connect(&ST_NetCon);
}
|