2013-07-12 129 views
0

我设置了一个程序让Arduino接收UDP数据包并发送一个简单的响应给这些数据包。出于某种原因,我的Android应用程序无法通过公共互联网接收到响应。如果我将手机连接到WLAN,我的应用程序将收到响应。在所有情况下,Arduino都能够接收Android发送的这些数据包,因为我已为此端口分配了一个端口转发器。Java应用程序无法通过互联网接收UDP数据包

我也检查了我的ISP的网站可能的端口限制。 Arduino连接的家庭有线连接具有公共IP,对该端口没有限制。我的移动宽带连接提供商对该端口没有限制,但他们使用NAT进行移动连接。可能这是一个问题?

在Android上我有以下代码:

byte[] data = ("data").getBytes(); 

try { 
    DatagramPacket packet = new DatagramPacket(data, data.length, arduinoAddress, arduinoPort); 

    socket.send(packet); 

    byte[] receiveData = new byte[1]; 
    DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length); 
    socket.receive(receivePacket); 

    System.out.println(new String(receivePacket.getData())); 
} catch(InterruptedIOException e) { 
    e.printStackTrace(); 

    return 2; 
} catch(IOException e) { 
    e.printStackTrace(); 
} 

的Arduino有这样的:

void loop() { 
    int packetSize = UDP.parsePacket(); 

    if(packetSize) { 
     UDP.read(packetBuffer, UDP_TX_PACKET_MAX_SIZE); 
     String data = String(packetBuffer); 

     for(int i = 0; i < UDP_TX_PACKET_MAX_SIZE; i++) { 
      packetBuffer[i] = 0; 
     } 

     Serial.println(data); 

     UDP.beginPacket(UDP.remoteIP(), UDP.remotePort()); 
     UDP.print("1"); 
     UDP.endPacket(); 

     ... 

回答

0

焕NAT使用你的UDP数据包转发到发端设备。我怀疑移动提供商是否这样做。

因此,使用UDP从移动环境中从互联网获取回复将很困难。

0

有很多关于此主题的信息。您正在查找的搜索词是“打孔”或“UDP打孔”。

Of course a Wikipedia article

A StackOverflow for good measure

我有类似的问题,因为你。根据如何连接我的手机和小型设备,我正在寻找Twitter和聊天服务之间的一部分。你如何发送小的私人消息,但只是指向点?

相关问题