完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我想将 3 个 ESP 板在 station 模式下连接到 AP 模式下的 ESP 板。也可以从 linux 连接到 ESP AP 板。
测试此配置时,我发现站点无法相互通信,只能与 AP 通信。 如果我在 AP 板上运行简单的 Arduino 草图,所有站点都可以相互通信。 FreeRTOS 最小代码: #define UDP_SERVER_AP_NAME "TEST-AP" #define UDP_SERVER_AP_PASWORD "TEST-AP-PASS0001" void user_init(void) { wifi_set_opmode(SOFTAP_MODE); struct softap_config* config = (struct softap_config*) zalloc(sizeof(struct softap_config)); sprintf((char*) config->ssid, UDP_SERVER_AP_NAME); sprintf((char*) config->password, UDP_SERVER_AP_PASWORD); config->authmode = AUTH_WPA_WPA2_PSK; config->ssid_len = 0; config->max_connection = 4; wifi_softap_set_config(config); } Arduino草图: void setup() { pinMode(LED_PIN, OUTPUT); // set pin as output Serial.begin(115200); Serial.println(); Serial.print("Setting soft-AP configuration ... "); Serial.println(WiFi.softAPConfig(local_IP, gateway, subnet) ? "Ready" : "Failed!"); Serial.print("Setting soft-AP ... "); Serial.println(WiFi.softAP("TEST-AP", "TEST-AP-PASS0001") ? "Ready" : "Failed!"); Serial.print("Soft-AP IP address = "); Serial.println(WiFi.softAPIP()); } void loop() { digitalWrite(LED_PIN, HIGH); // set the LED on delay(1000); // wait for a second digitalWrite(LED_PIN, LOW); // set the LED off delay(1000); // wait for a second } |
|
相关推荐
1个回答
|
|
在这种情况下,我们需要确保 ESP8266/ESP32 板在软 AP 模式下可以正常传输数据。以下是一些可能的解决方案:
1. **确保所有 ESP 板都配置正确**: - 确保所有 ESP 板都已正确配置为软 AP 模式或 station 模式。在您的代码中,AP 板应设置为 SOFTAP_MODE,而其他板应设置为 STATION_MODE。 2. **检查 IP 地址分配**: - 确保所有 ESP 板都获得了正确的 IP 地址。在软 AP 模式下,AP 板将为连接的 station 分配 IP 地址。您可以使用 `espconn_get_ip_info()` 函数获取连接设备的 IP 地址。 3. **使用 UDP 通信**: - 由于您提到使用 FreeRTOS,我们可以使用 UDP 协议进行通信。首先,创建一个 UDP 服务器在 AP 板上监听数据。然后,在其他 ESP 板上创建 UDP 客户端,向 AP 板发送数据。 4. **确保防火墙和安全设置允许通信**: - 检查您的网络设置,确保没有防火墙或其他安全设置阻止 ESP 板之间的通信。 5. **使用正确的端口号**: - 确保所有 ESP 板都使用相同的端口号进行通信。在您的代码中,您需要为 UDP 服务器和客户端指定一个端口号。 6. **调试和日志记录**: - 在您的代码中添加调试信息,以便在出现问题时更容易找到问题所在。您可以使用 `os_printf()` 函数在串口输出调试信息。 以下是一个简单的示例代码,展示了如何在 ESP8266/ESP32 上使用 FreeRTOS 和 UDP 进行通信: ```c #include #include #include #include #include #include #include #include #include #define UDP_SERVER_IP "192.168.4.1" #define UDP_SERVER_PORT 8000 static struct espconn udp_server; static struct espconn udp_client; void user_init(void) { uart_set_baud(0, 115200); wifi_set_opmode(STATION_MODE); wifi_station_set_hostname("ESP-Station"); wifi_station_connect(); espconn_create(&udp_client); udp_client.type = ESPCONN_UDP; udp_client.proto.udp = (esp_udp*)zalloc(sizeof(esp_udp)); udp_client.proto.udp->local_port = 8001; while (wifi_station_get_connect_status() != STATION_GOT_IP) { vTaskDelay(500 / portTICK_RATE_MS); } char *ip = (char *)wifi_station_get_hostname(); char *mask = (char *)wifi_station_get_mask(); char *gw = (char *)wifi_station_get_gw(); os_printf("Connected to AP: %sn", ip); os_printf("Mask: %sn", mask); os_printf("Gateway: %sn", gw); espconn_regist_recvcb(&udp_client, udp_recv); espconn_regist_sentcb(&udp_client, udp_sent); espconn_regist_disconcb(&udp_client, udp_disconnect); espconn_connect(&udp_client); } void udp_recv(void *arg, char *pdata, unsigned short len) { struct espconn *pesp_conn = (struct espconn *)arg; os_printf("Received %u bytes: %sn", len, pdata); // Echo the received data back to the server espconn_sendto(pesp_conn, pdata, len); } void udp_sent(void *arg) { os_printf("Data sentn"); } void udp_disconnect(void *arg) { struct espconn *pesp_conn = (struct espconn *)arg; espconn_disconnect(pesp_conn); } void vApplicationStackOverflowHook(xTaskHandle *pxTask, signed char *pcTaskName) { while (1) { ; } } ``` 请确保将 `UDP_SERVER_IP` 和 `UDP_SERVER_PORT` 替换为正确的值。此示例代码将在连接到 AP 后发送和接收 UDP 数据。您可以在 AP 板上运行类似的代码,以便在 station 模式下的 ESP 板之间进行通信。 |
|
|
|
只有小组成员才能发言,加入小组>>
543浏览 6评论
455浏览 5评论
有没有办法在不使用混杂模式的情况下实现Wifi驱动程序接收缓冲区访问中断呢?
435浏览 5评论
437浏览 4评论
410浏览 4评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 17:28 , Processed in 0.615144 second(s), Total 48, Slave 41 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号