0

UDP パケットを受信し、それらのパケットに簡単な応答を送信するように Arduino 用のプログラムをセットアップしました。何らかの理由で、私の Android アプリケーションは公共のインターネット経由で応答を受け取ることができません。電話を WLAN に接続すると、アプリケーションは応答を受け取ります。すべてのケースで、Arduino は Android から送信されたこれらのパケットを受信できます。これは、このポートにポート フォワーダーを割り当てているためです。

ポート制限の可能性について、ISP の Web サイトも確認しました。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 を使用してモバイル環境でインターネットからの応答を取得することは困難です。

于 2013-07-12T09:36:32.630 に答える
0

このトピックに関する多くの情報があります。お探しの検索ワードは「ホールパンチング」または「UDPホールパンチング」です。

もちろんウィキペディアの記事

適切な測定のための StackOverflow

あなたと同じような質問があります。携帯電話と小さなデバイスを接続する方法に沿って、Twitter とチャット サービスの中間にあるものを探しています。ポイントツーポイントだけで、小さなプライベートメッセージを送信するにはどうすればよいですか?

于 2013-07-13T05:33:39.653 に答える