簡體   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