文章目录
什么是TCP client、什么是透传
TCP client是TCP客户端,在建立TCP连接时一般有服务器和客户端两方。
透传是指不做任何数据处理的数据透明传输。
为什么使用TCP client透传模式
目的是做两块板子的近距离传输,蓝牙同时开两组会产生数据干扰,所以使用两个esp8266,使用AT指令配置简单。
两个esp8266可以建立TCP连接和UDP连接,但是UDP不可靠且易丢数,所以建立TCP连接,由于 TCP 的AP模式不能够进入透传所以只能使用TCP的STA模式进入透传,即TCP client。原因后面解释。
AT指令
AT指令很多,相关手册我上传到资料中(免费,不需要积分),配置TCP client透传的相关指令如下:
TCP连接需要一个服务器释放热点,释放TCP连接,配置TCP连接的端口、IP等参数。
这里ESP-A为STA(client)模式ESP-B为AP(server)模式
ESP-B为AP(server)———AT指令
指令 | 含义 |
---|---|
AT | 测试是否连接正常 |
AT+CWMODE_DEF=2 | 设置ap模式并保存到flash中,下次上电直接是ap模式 |
AT+RST | 重启模式生效 |
AT+CIPMUX=1 | 设置多连模式 |
AT+CIFSR | 查询本地IP |
AT+CWSAP=“null”,“12345678”,1,4 | 创建热点 |
AT+CIPSERVER=1,8080 | 开启 TCP 连接,设置端口 8080 |
注意点:
1.具体每个指令可以到手册里面查,正常返回什么,错误返回什么,返回的错误码是什么,根据这个调试
2.这里我B的模块的IP使用的是默认的,你可以根据指令修改,我记得是可以修改station的,ap的esp32可以修改,具体查看at指令手册,我这里默认的是192.168.4.1
3.开启tcp连接的前提是要设置多连模式:AT+CIPMUX=1;也正是因为开启了多连接模式才不能够开启透传模式:AT+CIPMODE=1;也进不去透传:AT+CIPSEND;所以AP模式(server)不能开启透传。
即:开启透传的条件是AT+CIPMUX=0(单连)和AT+CIPMODE=1(sta)同时满足才能进入
4.如果AP模式一直配置错误,使用指令:AT+RESTORE恢复出厂设置,断电重上后再配置。
5.也是因为使用了AT+CWMODE_DEF=2,此时为AP模式,只能释放热点,不能加入热点,
ESP-A为STA(client))———AT指令
指令 | 含义 |
---|---|
AT | 测试是否连接正常 |
AT+CWMODE_DEF=1 | 设置sta模式并保存到flash中,下次上电直接是sta模式 |
AT+RST | 重启模式生效 |
AT+CIPMUX=0 | 设置单连模式 |
AT+CWJAP=“null”,“12345678” | 加入热点 |
AT+CIPSTART=“TCP”,“192.168.4.1”,8080 | TCP 连接 |
AT+CIPMODE=1 | 设置透传模式 |
AT+CIPSEND | 进入透传 |
配置AP的代码
因为sta的代码太多了,有时间后续补上吧(主要是我用服务器测试的,没用代码测)
#define DELAY_MS(x) HAL_Delay(x) // 使用 HAL 库的延时函数
#define BUF_SIZE 128 // 修改为实际的最大缓冲区大小
// 辅助函数:发送 AT 指令
void SendATCommand(UART_HandleTypeDef *huart, const char *cmd, uint32_t delay) {
HAL_UART_Transmit_DMA(huart, (uint8_t *)cmd, strlen(cmd));
DELAY_MS(delay);
}
// 初始化 ESP8266
void ESP8266_Init(void) {
// 定义 AT 指令
const char *commands[] = {
"AT+UART_DEF=115200,8,1,0,0\r\n", // 设置串口
"AT+CWMODE=2\r\n", // AP 模式
"AT+RST\r\n", // 重启 AP 模式生效
"AT+CIPMUX=1\r\n", // 设置多连模式
"AT+CIFSR\r\n", // 查询服务器 IP
"AT+CWSAP=\"gwtrans1\",\"12345678\",1,4\r\n", // 创建热点
"AT+CIPSERVER=1,8080\r\n" // 开启 TCP 连接,设置端口 8080
};
// 延时设置
const uint32_t delay_ms = 5000;
// 发送每一条 AT 指令
for (int i = 0; i < sizeof(commands) / sizeof(commands[0]); i++) {
SendATCommand(&huart2, commands[i], delay_ms);
}
}