3

UDP データグラムをリモート ホストに送信するために Arduino イーサネットを使用しています。単一のデータグラムを送信するために使用するコードは次のとおりです。

Udp.begin(localPort);
...
Udp.beginPacket(remoteIP, remotePort);
Udp.write(data);
Udp.endPacket();

私の問題は、送信 UDP/IP パケットの TTL をカスタマイズする必要があることですが、Udp.beginUdp.beginPacketUdp.write 、およびUdp.endPacketのいずれも、そのようなオプションを設定するパラメーターを提供していません。

TTL フィールドがIP ヘッダーに属していることは知っていますが、Arduino のイーサネット / ソケット / w5100 ライブラリを使用して生の IP パケットを処理していないようです。

上記の関数の定義を調べました。特にEthernetUDP::beginPacket、メッセージのペイロードを渡す直前に呼び出される便利なものを見つけたいと思っていたところですが、startUDP()(socket. cpp) であり、後者は私には明確でない W5100 クラスのメソッドを扱っています。

パケットの TTL を設定するための何らかの高レベルの機能があるかどうか、誰かが知っていますか?それを達成するためにライブラリを深く掘り下げる必要がありますか?

4

1 に答える 1

3

最後に解決策を見つけました。WIZnet W5100 ソケットは、 W5100 データシート バージョン 1.1.6に記載されているソケットの動作を記述するレジスタを提供します。これらのレジスタの 1 つがSocket 0 IP TTL (S0_TTL)(address 0x0416) です。ソケットの宛先 IP アドレスとポートを設定するために、これらのレジスタがstartUDP関数 ( ) に書き込まれていることがわかります。socket.cpp

W5100.writeSnDIPR(s, addr);
W5100.writeSnDPORT(s, port);

だから私はそこに呼び出しを追加しました

W5100.writeSnTTL(s, (uint8_t) 255); // set TTL to 255

実際に機能しました。つまり、スケッチがコンパイルされました。そのような方法は文書化されていません。他のレジスタ書き込み方法を見て、それを利用するプロジェクトがいくつか存在することをウェブで見つけました。

また、このパッチUdp.beginPacket(remoteIP, remotePort, ttl)を作成して、Arduino 1.0.1 - 2012.05.21 に付属するイーサネット ライブラリにオーバーライドを提供しました。

于 2012-12-29T13:41:16.933 に答える