繁体   English   中英

从Linux C向许多Android手机发送UDP消息

[英]Send UDP message from Linux C to many Android phones

重写以尝试明确我的需求。

我的目标是在运行C和Linux的嵌入式Intel Edison处理器中复制Digital Yacht制造的设备的功能。 设备通过UDP发送到iRegatta等电话应用程序。 要设置该应用程序,只需输入端口号。 应用程序未在UDP模式下输入IP地址。 我以为这是微不足道的,但到目前为止,这里的专家都说这是不可能的,因此一定不要微不足道。 也许这就是为什么在我所有的阅读时间里都找不到一个例子。 有人告诉我,我被否决是因为,我试图做的事情不可能实现,但事实并非如此。 我不知道它是如何完成的,这就是为什么我来到这里的专家。

我想发送可能看起来像这样的nmea消息:

$GPGGA,123519,4807.038,N,01131.000,E,1,08,0.9,545.4,M,46.9,M,,*47

我希望任意数量的Android手机都能通过相应的应用接收它们。 您可以在仅指定端口号的情况下设置许多应用程序以接收UDP数据。 应用程序的设置中没有IP地址。 另外,我也不希望收到来自Android手机的任何信息。 这是一种方法,没有重新传输的能力,因此,如果一条消息没有到达那里,则下次有另一种机会。 一切都会每秒更新一次。

我尝试了以下操作,但未在应用程序中获取数据。 根据评论,我必须在Linux机器上添加某种路由器功能。

void init_udp(){
    return;
    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);
    if (sock < 0){
        printf("ER UDP Socket error\n");
    }
    else printf("UP Socket %d OK\n",sock);
}

void write_udp(char *buf){
    return;
// nmea data is in buff
    if (sock >= 0){
        int on = 1;
        setsockopt( sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on) );
        struct sockaddr_in    address = {0};
        address.sin_family = AF_INET;
        address.sin_addr.s_addr = inet_addr( "255.255.255.255" ); //
        address.sin_port = htons( 3000 );
        if ( sendto( sock, buf, strlen(buf), 0, (struct sockaddr*)&address, sizeof(address) ) < 0) printf("ER UDP send error\n");
        else {
            printf("UP %s\n",buf);
        }
    }
}

我不确定我需要做什么。

您要做的是将UDP数据包发送到广播IP地址。 这将发送到子网中的事物。 例如10.255.255.255是10.xxx子网的广播地址。 您还可以使用全局255.255.255.255,该地址也应发送到您的子网,并且现在没有路由器将其传递给另一个子网。

另外,您还需要使套接字能够发送广播消息。 特别是您需要设置SO_BROADCAST选项。 由于BOOL缘故,以下是Windows。 它可能是大多数平台的int。

BOOL on = TRUE;
setsockopt( sock, SOL_SOCKET, SO_BROADCAST, &on, sizeof(on) );

同样,除非UDP套接字已“连接”,否则您不能对UDP套接字使用send() ,因此您应该使用sendto()并使用广播地址。

要指定地址和端口,请使用需要创建一个套接字地址。

struct sockaddr_in    address = {0};

address.sin_family = AF_INET;
address.sin_add.s_addr = inet_addr( "255.255.255.255" );
address.sin_port = htons( 3000 );

sendto( sock, buff, strlen(buff), 0, (struct sockaddr*)&address, sizeof(address) );

注意类型转换的使用。 这是因为sendto需要一个sockaddr ,它是一种通用地址类型,在这里我们专门使用IPV4地址。 sockaddr_in映射到sockaddr

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM