ESP8266踩坑日记day6 TCPserver

本文记录了在ESP8266上配置TCP服务器的详细步骤,包括将其设置为AP模式,定义相关结构体,设定TCP接口,设置超时时间,并注册TCP连接成功的回调函数。通过回调函数实现客户端通过发送特定字符来控制ESP8266的LED灯状态。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TCPserver配置步骤:

1.将ESP8266配置为AP模式

参考day4

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

2.配置相关结构体

在这里插入图片描述
在这里插入图片描述
type中成员proto必须先申请内存再使用
TPCserver需配置参数;
type:设置为0x10(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,MAC
  p = 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~13
 wif.authmode = AUTH_WPA2_PSK;            //设置加密方式
 wif.ssid_hidden = 0;                     //不隐藏WIFI
 wif.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);   //设置定时器定时时间并开启定时器

 //初始化LED
 PIN_FUNC_SELECT(PERIPHS_IO_MUX_GPIO4_U, FUNC_GPIO4); // GPIO4设为IO口

 GPIO_OUTPUT_SET(GPIO_ID_PIN(4),1);      // IO4 = 1

 os_printf("\n\r初始化完成\n\r");

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值