0

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

我还检查了我的 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();

        ...
4

2 回答 2

0

使用 NAT 时,您必须将 UDP 数据包转发到始发设备。我怀疑移动提供商会这样做。

因此,在移动环境中使用 UDP 从 Internet 获取回复将是困难的。

于 2013-07-12T09:36:32.630 回答
0

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

当然是维基百科的文章

一个很好的衡量标准的 StackOverflow

我和你有类似的问题。沿着如何连接我的手机和小型设备的思路,我正在寻找介于 Twitter 和聊天服务之间的东西。怎么发小私信,却只能点对点?

于 2013-07-13T05:33:39.653 回答