【问题标题】:ESP32 - UDP broadcaster/ receiver with native LwIP libraryESP32 - 带有本地 LwIP 库的 UDP 广播器/接收器
【发布时间】:2017-11-08 00:39:27
【问题描述】:

我正在使用 ESP32(顺便说一句,一个很棒的平台)构建一个分布式应用程序,所有参与者都应该通过 UDP 以最简单的形式进行通信:通过广播发送消息并收听所有浮动的消息。每个参与者自己过滤相关消息。

到目前为止,我有以下初始化例程:

int lavor_wifi_openUDPsocket(){
    // Create a socket
    int sckt = socket(AF_INET, SOCK_DGRAM, 0);
    if ( sckt < 0 ){
        printf("socket call failed");
        exit(0);
    }

    // Prepare binding to port
    struct sockaddr_in sLocalAddr;
    // Initialize the address
    memset((char *)&sLocalAddr, 0, sizeof(sLocalAddr));

    sLocalAddr.sin_family = AF_INET;
    sLocalAddr.sin_len = sizeof(sLocalAddr);
    sLocalAddr.sin_addr.s_addr = htonl(INADDR_ANY);
    sLocalAddr.sin_port = UDP_SOCKET_PORT;

    bind(sckt, (struct sockaddr *)&sLocalAddr, sizeof(sLocalAddr));

    return sckt;
}

然后,将发送一条消息:

void lavor_wifi_sendUDPmsg(int sckt, char* msg, int len){
    // Prepare the address to sent to via BROADCAST
    struct sockaddr_in sDestAddr;
    // Initialize the address
    // memset((char *)&sDestAddr, 0, sizeof(sDestAddr));

    sDestAddr.sin_family = AF_INET;
    sDestAddr.sin_len = sizeof(sDestAddr);
    sDestAddr.sin_addr.s_addr = htonl(INADDR_BROADCAST);
    sDestAddr.sin_port = UDP_SOCKET_PORT;

    if(sendto(sckt, msg, len, 0, (struct sockaddr *)&sDestAddr, sizeof(sDestAddr)) < len){
         printf("UDP message couldn't be sent.");
    }
}

最后,接收消息的工作方式如下:

void lavor_wifi_processor(void* sckt){
    int nbytes;
    char buffer[UDP_BUFF_LEN];
    // Listen for incoming messages as long as the socket is open
    while(1){   // TO DO: Test if socket open
        // Try to read new data arrived at the socket
        nbytes = recv(*((int *)sckt), buffer, sizeof(buffer), 0);
    ...

但即使我只是尝试调用上面的初始化函数,ESP 也会变得疯狂并引发一个又一个 Guru Meditation 错误。

有没有人有以所述方式进行 UDP 通信的经验?

【问题讨论】:

    标签: c lwip esp32


    【解决方案1】:

    我得到了 UDP 和 ESP32/UDP/LWIP 来处理这个例子:

    https://github.com/Ebiroll/qemu_esp32/blob/master/examples/19_udp

    请注意,在我们收到 IP 地址之前,send_thread() 不会启动。

    但是,您也可能需要 esp-idf 的 v2.0。我也遇到了最新版本的 Guru Meditation 错误。

    【讨论】:

    • 谢谢!我想我以某种方式解决了它,但从那以后已经有几天了......因此,我无法验证您的答案并将其标记为已解决。但很可能,你是对的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2021-05-12
    • 1970-01-01
    相关资源
    最近更新 更多