У меня есть следующие настройки:
- Ноутбук + плата ESP32 в том же WiFi
- TCP-слушатель на плате, подключенный TCP-клиент на ноутбуке
- I Я выполняю сценарий python на ноутбуке, который отправляет некоторые параметры плате по TCP
- при поступлении параметров, плата отвечает сообщением «Хорошо, brb» и закрывает сокет
- плата делает вещи (если это важно: отключается от старого WiFi, чтобы подключиться к другому WiFi, где она подключается через TCP ко второй плате для выполнения некоторых измерений)
- плата снова присоединяется к старому WiFi и пытается подключиться к ноутбуку через новый разъем для отправки данных измерений, поэтому на этот раз плата является клиентом, а ноутбук слушателем
Чтобы подготовить соединение на ноутбуке, оно закрывается старый сокет (sock.close()
), когда приходит сообщение «Хорошо, brb» и ждет новых соединений (new_sock, addr = sock_server.accept()
), чтобы затем получить материал (new_sock.recv()
).
Однако, при попытке сделать это, я получаю errno 113 (нет маршрута к хосту). Я на 99% уверен, что сценарий python не проблема, он работал с другими досками раньше. Итак, вот важная часть эскиза ESP32:
// Connection to socket sock already happened and we just received data!
// Get the sender's IP address as string
if (source_addr.sin6_family == PF_INET)
{
inet_ntoa_r(((struct sockaddr_in *)&source_addr)->sin_addr.s_addr, addr_str, sizeof(addr_str) - 1);
}
else if (source_addr.sin6_family == PF_INET6)
{
inet6_ntoa_r(source_addr.sin6_addr, addr_str, sizeof(addr_str) - 1);
}
int err = send(sock, brb_message, sizeof(brb_message), 0);
if (err < 0)
{
ESP_LOGE(TAG, "Error occurred during sending: errno %d", errno);
break;
}
shutdown(sock, 0);
closesocket(sock);
esp_wifi_disconnect();
connect_to_new_wifi_and_do_stuff();
// get back into joint WiFi
esp_wifi_disconnect();
connect_to_old_wifi();
// send back collected data via TCP
dest_addr.sin_addr.s_addr = inet_addr(addr_str);
dest_addr.sin_family = AF_INET;
dest_addr.sin_port = htons(TCP_PORT);
addr_family = AF_INET;
ip_protocol = IPPROTO_IP;
int sock_back = socket(addr_family, SOCK_STREAM, ip_protocol);
if (sock_back < 0)
{
ESP_LOGE(TAG, "Unable to create socket: errno %d", errno);
}
ESP_LOGI(TAG, "Socket created, connecting to %s:%d", addr_str, TCP_PORT);
else
{
err = connect(sock_back, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
while (err < 0)
{
ESP_LOGE(TAG, "Socket unable to connect: errno %d", errno);
err = connect(sock_back, (struct sockaddr *)&dest_addr, sizeof(dest_addr));
}
ESP_LOGI(TAG, "Successfully connected");
err = send(sock_back, run_id, sizeof(run_id), 0);
if (err < 0)
{
ESP_LOGE(TAG, "Error occurred during sending to %s: errno %d", addr_str, errno);
break;
}
}
У меня такое ощущение, что я делаю что-то не так, но я действительно не могу это понять, и я пытался несколько дней. Есть идеи?