当前位置: 代码迷 >> 综合 >> ESP8266踩坑日记day6 TCPserver
  详细解决方案

ESP8266踩坑日记day6 TCPserver

热度:43   发布时间:2024-02-11 15:44:41.0

TCPserver配置步骤:

1.将ESP8266配置为AP模式

参考day4

在这里插入图片描述
在这里插入图片描述

2.配置相关结构体

在这里插入图片描述
在这里插入图片描述
type中成员proto必须先申请内存再使用
TPCserver需配置参数;
type:设置为0x01(TCP模式)
proto.tcp->local_port:设置端口号(本机)

3.建立TCP接口

在这里插入图片描述
将上面创建结构体地址传入函数即可

4.设置超时时间

在这里插入图片描述
5.注册TCP成功连接回调函数
在这里插入图片描述
回调函数的形参必须与手册中相同,回调函数调用后,TCP通信建立
代码如下,实现客户端发送”K“亮灯,发送“G”关灯,串口显示连接主机信息

/*******************************结构体定义**********************************/
struct softap_config wif;          //WIFI AP配置结构体
struct espconn TCP_s;                //TCP配置结构体
/***********************************************************************/
os_timer_t tim1;
void ICACHE_FLASH_ATTR delay(u32 C_time)            //毫秒延时函数
{ for(;C_time>0;C_time--)os_delay_us(1000);
}
void esprr(void *arg,char *pusrdata,unsigned short len)
{struct espconn *U_arg = arg;remot_info * P_port_info = NULL;char ch[32] = "接收成功";os_printf("接收数据:%s\n",pusrdata);              //串口显示接收信息espconn_send(arg,ch,strlen(ch));                //向客户端发送应答if((*pusrdata == 'k')||((*pusrdata == 'K')))GPIO_OUTPUT_SET(GPIO_ID_PIN(4),0);          //开灯else if((*pusrdata == 'g')||((*pusrdata == 'G')))GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);          //关灯
}
/*TCP异常断开回调函数*/
void esprc(void *arg,sint8 err)
{os_printf("连接异常断开\n");
}
/*TCP成功连接回调函数*/
void TCP_ccf(void *arg)
{char i;char ip[4] = {0};                                      //保存IP地址struct station_info *out_ip;                           //连接远程主机信息struct station_info *p;os_printf("连接数:%d\n",wifi_softap_get_station_num()); //显示连接数out_ip = wifi_softap_get_station_info();               //获取接入设备IP,MAC地址p = out_ip;for(i = 0; i < wifi_softap_get_station_num(); i++)     //循环显示连接主机信息{ip[0] = p->ip.addr;                                //IP地址拆分为点分式ip[1] = p->ip.addr >> 8;ip[2] = p->ip.addr >> 16;ip[3] = p->ip.addr >> 24;os_printf("远端主机%d:IP:%d.%d.%d.%d,MAC:%x:%x:%x:%x:%x:%x\n",i+1,ip[0],ip[1],ip[2],ip[3],p->bssid[0],p->bssid[1],p->bssid[2],p->bssid[3],p->bssid[4],p->bssid[5]);//串口显示连接主机IP,MACp = p->next.stqe_next;                             //偏移指针显示下一个节点信息(主机信息按链表存储)}espconn_regist_recvcb(arg,esprr);                      //注册成功连接回调函数espconn_regist_reconcb(arg,esprc);                     //注册异常断开回调函数
}
/*软定时回调函数*/
void tim1_f()
{
}
void ICACHE_FLASH_ATTR
user_init(void)
{
/**********************************结构体配置*********************************************/os_memset(&wif,0,sizeof(wif));           //清空结构体
/**/os_strcpy(wif.ssid,"ESP8266");           //设置WIFI名os_strcpy(wif.password,"123456789");     //设置WiFi密码wif.ssid_len = os_strlen("ESP8266");     //wifi名长度wif.channel = 1;                         //通道号1~13wif.authmode = AUTH_WPA2_PSK;            //设置加密方式wif.ssid_hidden = 0;                     //不隐藏WIFIwif.max_connection = 4;                  //最大连接数(最大只能填4)wif.beacon_interval = 100;               //默认100,范围100~60000ms
/**/TCP_s.type = ESPCONN_TCP;                //设置为TCP通信方式TCP_s.proto.tcp = (esp_tcp *)os_zalloc(sizeof(esp_tcp));//申请TCP内存TCP_s.proto.tcp->local_port = 8266;                  //设置端口号/**********************************WIFI配置初始化*********************************************/wifi_set_opmode(0x02);//0x01: Station 模式 wifi接收模式//0x02: SoftAP 模式 wifi发射模式//0x03: Station+SoftAP 模式wifi_softap_set_config(&wif);           //设置WiFi AP配置espconn_regist_connectcb(&TCP_s,&TCP_ccf); //注册连接成功回调函数espconn_accept(&TCP_s);                 //创建TCP接口espconn_regist_time(&TCP_s,300,0);      //设置超时时间
/*****************************************************************************************///uart_init(115200,115200); //设置串口波特率delay(1000);                  //延时等待串口稳定os_printf("\n\r--------------------------------\n\r");os_printf("SDK version:%s\n",system_get_sdk_version());os_printf("\n\r--------------------------------\n\r");os_timer_disarm(&tim1);     //关闭定时器os_timer_setfn(&tim1,tim1_f,NULL);   //设置定时器回调函数os_timer_arm(&tim1,1000,1);   //设置定时器定时时间并开启定时器//初始化LEDPIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);      // IO4 = 1os_printf("\n\r初始化完成\n\r");}