本博文全部代码下载链接: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_sentcb 和 espconn_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");
}