[英]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.