esp32 判断是否连接TCP服务器成功
时间: 2023-08-04 10:02:53 浏览: 150
在 ESP32 上判断是否连接 TCP 服务器成功,可以通过以下步骤:
1. 创建一个 TCP 连接,并获取连接的句柄。
2. 使用 esp_netif_get_ip4_addr 函数获取本地 IP 地址,判断是否获取成功,如果获取失败则表示网络连接失败。
3. 使用 esp_netif_get_ip4_gateway 函数获取网关的 IP 地址,判断是否获取成功,如果获取失败则表示网络连接失败。
4. 使用 esp_netif_get_ip4_netmask 函数获取子网掩码,判断是否获取成功,如果获取失败则表示网络连接失败。
5. 使用 esp_tcp_connect 函数连接远程 TCP 服务器,并判断连接状态是否成功。
6. 如果连接成功,返回连接句柄,否则返回 NULL。
7. 使用 getsockopt 函数获取连接状态,如果连接状态为已连接,则表示连接成功,否则连接失败。
以下是示例代码:
```
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_netif.h"
#include "esp_log.h"
#include "lwip/sockets.h"
#include "lwip/dns.h"
#include "lwip/netdb.h"
#define TAG "TCP"
void tcp_connect(void)
{
struct sockaddr_in dest_addr;
dest_addr.sin_addr.s_addr = inet_addr("192.168.0.100"); // 远程 TCP 服务器 IP 地址
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(8080); // 远程 TCP 服务器端口
int sock = socket(AF_INET, SOCK_STREAM, IPPROTO_IP);
if (sock < 0) {
ESP_LOGE(TAG, "Failed to create socket");
return;
}
if (connect(sock, (struct sockaddr *)&dest_addr, sizeof(dest_addr)) != 0) {
ESP_LOGE(TAG, "Failed to connect");
return;
}
ESP_LOGI(TAG, "TCP connected, sock=%d", sock);
int optval;
socklen_t optlen = sizeof(optval);
if (getsockopt(sock, SOL_SOCKET, SO_ERROR, &optval, &optlen) < 0) {
ESP_LOGE(TAG, "Failed to getsockopt");
return;
}
if (optval != 0) {
ESP_LOGE(TAG, "Failed to connect to server");
return;
}
ESP_LOGI(TAG, "Connected to server");
}
void wifi_connect(void)
{
ESP_ERROR_CHECK(esp_netif_init());
ESP_ERROR_CHECK(esp_event_loop_create_default());
esp_netif_config_t netif_config = ESP_NETIF_DEFAULT_WIFI_STA();
esp_netif_t *netif = esp_netif_new(&netif_config);
assert(netif);
wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
ESP_ERROR_CHECK(esp_wifi_init(&cfg));
ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
ESP_ERROR_CHECK(esp_wifi_start());
wifi_config_t wifi_config = {};
strcpy((char *)wifi_config.sta.ssid, "ssid");
strcpy((char *)wifi_config.sta.password, "password");
ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
ESP_ERROR_CHECK(esp_wifi_connect());
}
void app_main()
{
wifi_connect();
tcp_connect();
}
```
注意:以上示例代码仅供参考,具体实现需要根据实际情况进行调整。
阅读全文