ESP8266 TCP Client功能实现

本博文全部代码下载链接https://download.csdn.net/download/zq666888/13119609

本博客实现了ESP8266 TCP客户端编程,实现了和TCP服务器的连接,发送数据以及接受数据的功能,效果图如下:

使用的SDK是NONOS3.0,API的使用请参考 ESP8266 Non-OS SDK API参考 链接:https://www.espressif.com/sites/default/files/documentation/2c-esp8266_non_os_sdk_api_reference_cn.pdf

要想实现TCP Client功能需要经过以下步骤:

1、配置ESP8266工作在Station模式,并且连接至AP分配IP地址,启用Client连接。

先配置Station相关参数,比如连接AP的ssid和password,然后连接AP,设定一个检查wifi状态的定时器,当检测到已经获取到IP时关闭定时器,初始化客户端。

void ICACHE_FLASH_ATTR
CheckWifiState(void)
{
	uint8 Status = 0;
	uint8 LedFlag = 0;
	static uint8 RedFlag = 0;
	struct	ip_info MyIpInfo;
	Status = wifi_station_get_connect_status();
	if(Status == STATION_GOT_IP)//已经获取到IP
	{
		os_timer_disarm(&WifiState); //关闭定时器
		for(LedFlag = 0;LedFlag < 5;LedFlag++)
		{
			GPIO_OUTPUT_SET(GPIO_ID_PIN(4),LedFlag%2); //快闪3次
			delay_ms(300);
		}
		GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0);
		OLED_ShowString(0,2,"connect OK");		// ESP8266
		wifi_get_ip_info(STATION_IF,&MyIpInfo);//查询Wifi Station接口或者SoftAp的IP地址
		char RemoteIP[4] = {192,168,1,110};
		MyStationInit((struct ip_addr *)RemoteIP,&MyIpInfo.ip,8080);//初始化客户端,连接服务器
	}
	else
	{
		if(RedFlag == 0)
		{
			GPIO_OUTPUT_SET(GPIO_ID_PIN(5),1); //绿灯默认灭
			RedFlag = 1;
		}
		else if(RedFlag == 1)
		{
			GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0); //绿灯默认灭
			RedFlag = 0;
		}
	}

}
/******************************************************************************
 * FunctionName : user_init
 * Description  : entry of user application, init user function here
 * Parameters   : none
 * Returns      : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
    partition_item_t partition_item;
    struct	station_config StaConfig;
    uart_init(115200,115200);	// 初始化串口波特率
    os_delay_us(10000);			// 等待串口稳定
    os_printf("SDK version:%s\n", system_get_sdk_version());
	OLED_Init();// OLED初始化
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U,FUNC_GPIO4);
	PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO5_U,FUNC_GPIO5);
	GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1); //绿灯默认灭
	GPIO_OUTPUT_SET(GPIO_ID_PIN(5),0); //红灯默认灭
	OLED_ShowString(0,0,"ESP8266 STA");		// ESP8266
	wifi_set_opmode(0x01); //设置wifi模式为Station模式
	os_memset(&StaConfig,0,sizeof(struct station_config));
	os_memcpy(StaConfig.ssid,"12345678",strlen("12345678"));
	os_memcpy(StaConfig.password,"12345678",strlen("12345678"));
	wifi_station_set_config(&StaConfig);//设置 Wi-Fi Station 接口的配置参数,并保存到 Flash
	wifi_station_connect();//ESP8266 Wi-Fi Station 接口连接 AP


	os_timer_disarm(&WifiState);
	os_timer_setfn(&WifiState,(os_timer_func_t *)CheckWifiState,NULL);
	os_timer_arm(&WifiState,1000,1);
}

2、依据工作协议初始化 espconn 参数。

定义一个结构体struct  espconn MyEspconn,初始化TCP Client相关参数,包括服务器IP,端口,本地IP,端口,注册连接成功和重新连接的回调函数

void ICACHE_FLASH_ATTR
MyStationInit(struct ip_addr  *RemoteIP,struct ip_addr  *LocalIP,int RemotePort)
{
	MyEspconn.proto.tcp = (esp_tcp *) os_zalloc(sizeof(esp_tcp));//申请TCP内存
	MyEspconn.type = ESPCONN_TCP;//连接种类
	os_memcpy(MyEspconn.proto.tcp->local_ip,LocalIP,4);//本机IP
	os_memcpy(MyEspconn.proto.tcp->remote_ip,RemoteIP,4);//服务器IP
	MyEspconn.proto.tcp->local_port = espconn_port();//本地端口
	MyEspconn.proto.tcp->remote_port = RemotePort;//服务器端口

	//注册连接成功回调函数和重新连接回调函数
	espconn_regist_connectcb(&MyEspconn,Myconnectcb);//连接成功回调函数
	espconn_regist_reconcb(&MyEspconn,Myreconcb);//TCP连接异常回调函数
	espconn_connect(&MyEspconn);//连接TCP
	os_printf("Tcp Begin connect\r\n");
}

3、注册连接成功的回调函数和连接失败重连的回调函数。

• 调用 espconn_regist_connectcb espconn_regist_reconcb

void Myconnectcb(void *args)
{
	os_printf("Tcp Connect Success!\r\n");

	struct	espconn *Espcon = args;
	espconn_regist_recvcb(Espcon,EspRecvcb);//注册成功接收⽹网络数据的回调函数
	espconn_regist_sentcb(Espcon,EspSentcb);//注册⽹网络数据发送成功的回调函数
	espconn_regist_disconcb(Espcon,EspDisconcb);//注册 TCP 连接正常断开成功的回调函数
	espconn_send(Espcon,"Hello",5);
}
/*
 TCP连接失败回调函数
 */
void Myreconcb(void *arg,sint8 err)
{
	os_printf("Tcp Connect error!\r\n");
	espconn_connect(&MyEspconn);
	os_printf("Tcp Begin connect\r\n");
}

4、调用 espconn_connect 建⽴立与 TCP Server 的连接。

5、TCP连接建立成功后,在连接成功的回调函数 espconn_connect_callback 中,注册接收数据的回调函数,发送数据成功的回调函数和断开连接的回调函数。

• 调用 espconn_regist_recvcb espconn_regist_sentcbespconn_regist_disconcb

发送数据到TCP服务端可以使用espconn_send函数。

void EspSentcb(void *args)
{
	os_printf("Tcp Sent OK!\r\n");
}
/*
 接收数据的回调函数
  */
void EspRecvcb(void *arg,char *pdata,unsigned short len)
{
	os_printf("Tcp Sent OK!\r\n");
	os_printf("Data:%s\r\n",pdata);
	os_printf("Data Length:%d\r\n",len);
}
/*
 连接正常断开成功的回调函数
 */
void EspDisconcb(void *arg, sint8 err)
{
	os_printf("Tcp Connect error!\r\n");
	espconn_connect(&MyEspconn);
	os_printf("Tcp Begin connect\r\n");
}

 

 

 


 

 

 

 

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Karl Zhangq

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值