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();
...