一、详细步骤
1、导入头文件
#include "espconn.h"//TCP连接需要的头文件
#include "mem.h" //系统操作需要的头文件
2、创建全局TCP连接配置的结构体
struct espconn user_tcp_espconn; //TCP连接配置的结构体
3、配置ESP8266为AP模式
手机或电脑必须和ESP8266处于同一局域网下才能进行连接通信,所以将ESP8266配置为AP模式,充当路由器;
手机或电脑连接ESP8266发射出来的WiFi
//配置ESP8266为AP模式
//------------------------------------------------------------------------------------------------------
struct softap_config apConfig;
wifi_set_opmode(0x02); //设置为AP模式,并保存到 flash
apConfig.ssid_len = 8; //设置ssid长度
os_strcpy(apConfig.ssid, "SunLaiFu"); //设置wifi名字,注意这个是8266发出来的热点
os_strcpy(apConfig.password, "12345678"); //设置密码
apConfig.authmode = 3; //设置加密模式
apConfig.beacon_interval = 100; //信标间隔时槽100 ~ 60000 ms
apConfig.channel = 1; //通道号1 ~ 13
apConfig.max_connection = 4; //最大连接数
apConfig.ssid_hidden = 0; //隐藏SSID
wifi_softap_set_config(&apConfig); //设置 WiFi soft-AP 接口配置,并保存到 flash
//------------------------------------------------------------------------------------------------------
4、配置TCP服务器
//配置TCP服务器
//------------------------------------------------------------------------------------------------------
user_tcp_espconn.proto.tcp = (esp_tcp *) os_zalloc(sizeof(esp_tcp)); //分配空间
user_tcp_espconn.type = ESPCONN_TCP; //设置类型为TCP协议
user_tcp_espconn.proto.tcp->local_port = Local_port; //本地端口
espconn_regist_connectcb(&user_tcp_espconn, server_listen); //注册 TCP 连接成功建立后的回调函数
espconn_regist_reconcb(&user_tcp_espconn, server_recon); //注册 TCP 连接发生异常断开时的回调函数,可以在回调函数中进行重连
espconn_accept(&user_tcp_espconn); //创建 TCP server,建立侦听
espconn_regist_time(&user_tcp_espconn, 180, 0); //设置超时断开时间 单位:秒,最大值:7200 秒
//------------------------------------------------------------------------------------------------------
5、添加注册监听函数
//监听回调函数
void ICACHE_FLASH_ATTR server_listen(void *arg) //注册 TCP 连接成功建立后的回调函数
{
struct espconn *pespconn = arg;
espconn_regist_recvcb(pespconn, server_recv); //接收
espconn_regist_sentcb(pespconn, server_sent); //发送
espconn_regist_disconcb(pespconn, server_discon); //断开
}
5、添加接收、发送、断开、重连回调函数
void ICACHE_FLASH_ATTR server_recv(void *arg, char *pdata, unsigned short len) {
os_printf("recv data: %s\n", pdata);
espconn_sent((struct espconn *) arg, "received!", strlen("received!"));
}
void ICACHE_FLASH_ATTR server_sent(void *arg) {
os_printf("send successful!\n");
}
void ICACHE_FLASH_ATTR server_discon(void *arg) {
os_printf("disconnected!\n");
}
二、效果展示
编译成功
烧录成功
打开串口调试助手,复位上电
连接ESP8266发射的WiFi
创建TCP客户端连接ESP8266的TCP服务器
发送消息测试
三、详细代码
user_main.c
#include "espconn.h"
#include "mem.h"
struct espconn user_tcp_espconn;
void ICACHE_FLASH_ATTR server_recv(void *arg, char *pdata, unsigned short len) {
os_printf("recv data: %s\n", pdata);
espconn_sent((struct espconn *) arg, "received!", strlen("received!"));
}
void ICACHE_FLASH_ATTR server_sent(void *arg) {
os_printf("send successful!\n");
}
void ICACHE_FLASH_ATTR server_discon(void *arg) {
os_printf("disconnected!\n");
}
void ICACHE_FLASH_ATTR server_listen(void *arg) //注册 TCP 连接成功建立后的回调函数
{
struct espconn *pespconn = arg;
espconn_regist_recvcb(pespconn, server_recv); //接收
espconn_regist_sentcb(pespconn, server_sent); //发送
espconn_regist_disconcb(pespconn, server_discon); //断开
}
void ICACHE_FLASH_ATTR server_recon(void *arg, sint8 err) //注册 TCP 连接发生异常断开时的回调函数,可以在回调函数中进行重连
{
os_printf("connect error: %d\r\n", err); //%d,用来输出十进制整数
}
void Inter213_InitTCP(uint32_t Local_port) {
user_tcp_espconn.proto.tcp = (esp_tcp *) os_zalloc(sizeof(esp_tcp)); //分配空间
user_tcp_espconn.type = ESPCONN_TCP; //设置类型为TCP协议
user_tcp_espconn.proto.tcp->local_port = Local_port; //本地端口
espconn_regist_connectcb(&user_tcp_espconn, server_listen); //注册 TCP 连接成功建立后的回调函数
espconn_regist_reconcb(&user_tcp_espconn, server_recon); //注册 TCP 连接发生异常断开时的回调函数,可以在回调函数中进行重连
espconn_accept(&user_tcp_espconn); //创建 TCP server,建立侦听
espconn_regist_time(&user_tcp_espconn, 180, 0); //设置超时断开时间 单位:秒,最大值:7200 秒
}
void WIFI_Init() {
struct softap_config apConfig;
wifi_set_opmode(0x02); //设置为AP模式,并保存到 flash
apConfig.ssid_len = 8; //设置ssid长度
os_strcpy(apConfig.ssid, "SunLaiFu"); //设置wifi名字,注意这个是8266发出来的热点
os_strcpy(apConfig.password, "12345678"); //设置密码
apConfig.authmode = 3; //设置加密模式
apConfig.beacon_interval = 100; //信标间隔时槽100 ~ 60000 ms
apConfig.channel = 1; //通道号1 ~ 13
apConfig.max_connection = 4; //最大连接数
apConfig.ssid_hidden = 0; //隐藏SSID
wifi_softap_set_config(&apConfig); //设置 WiFi soft-AP 接口配置,并保存到 flash
}
void tcp_service_init() //初始化
{
WIFI_Init();
Inter213_InitTCP(6666); //本地端口
}
/******************************************************************************
* FunctionName : user_init
* Description : entry of user application, init user function here
* Parameters : none
* Returns : none
*******************************************************************************/
void ICACHE_FLASH_ATTR
user_init(void)
{
uart_init(115200,115200);
os_delay_us(1000);
os_printf("\r\n=================================================\r\n");
os_printf("\t Project:\t%s\r\n", ProjectName);
os_printf("\t SDK version:\t%s", system_get_sdk_version());
os_printf("\r\n=================================================\r\n");
tcp_service_init();
}