看代码:
/*以下代码的一部分是自己封装的库、组件*/
//引脚初始化
gpio_init(2, GPIO_MODE_OUTPUT);
//LED亮
gpio_set_level(2, 1);
//连接网络
WiFi_connect();
//LED灭
gpio_set_level(2, 0);
/*@delay*/
//创建TCP socket
int c_sock = create_sock("192.168.10.100", 8080);
//连接TCP,问题就是这里,灯灭后总是报错Socket unable to connect: errno 118
//118报错信息就是无法 连接/触及 到(192.168.10.100:8080)的意思
sock_connect(c_sock);
sock_send(c_sock, "hello");
解决办法:
连接WIFI后,不能第一时间去创建socket连接,需要延时,再进行socket通讯;
就在上面/*@delay*/的位置加延时。
我测试了一下,需要900ms以上!
能帮助到的给个♥,我找了一下午的错⑤。
发现要延时的原因了,socket 通讯要在获取到路由器分配 ip 的事件后才能使用,就是注册IP的事件,在事件中放个标志位,等待标志位置位后再进行socket 通讯
static void wifi_event_handler(void* arg, esp_event_base_t event_base,
int32_t event_id, void* event_data)
{
// STA 事件处理
if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_CONNECTED) {
// 这时候只是WIFI连接成功,IP还没有分配。
ESP_LOGI(TAG_STA, "WiFi is connected");
}else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_START) {
esp_wifi_connect();
ESP_LOGI(TAG_STA, "WIFI_EVENT_STA_START");
} else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) {
esp_wifi_connect();
} else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) {
// 这个时候的分配到了IP,就可以开始socket通讯的。
connect_flag = 1; // 给上连接标志
ip_event_got_ip_t* event = (ip_event_got_ip_t*) event_data;
ESP_LOGI(TAG_STA, "got ip:" IPSTR, IP2STR(&event->ip_info.ip));
}
}