ESP8266_AP模式、TCP连接

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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值