Mono for AndroidでUDPブロードキャストを受信しようとしていますが、データが届きません。これは、GalaxyTab7とGalaxyTab10(Android v 3.2)で正常に動作するため、やや複雑ですが、失敗します。 HTC G2(Android v2.3.4)。
コードは単純です:
public void BeginDiscover()
{
var packet = new DiscoverPacket();
lock (m_syncRoot)
{
var localEndpoint = new IPEndPoint(m_local, 0);
using (var udp = new UdpClient(localEndpoint))
{
var remoteEndpoint = new IPEndPoint(IPAddress.Broadcast, DiscoverPort);
udp.Send(packet.Data, packet.Data.Length, remoteEndpoint);
Thread.Sleep(100);
}
}
}
マニフェストに次の行が含まれていることを確認しました。
<uses-permission android:name="android.permission.INTERNET" />
これはデバッグで発生しているので、とにかく暗黙的に設定する必要があります。
その他の非常に奇妙な観察:
- 繰り返しますが、これは別のタイプのデバイスで問題なく機能しています
- UDPブロードキャストをリッスンしているハンドラー(応答をリッスンしているリスト)は、このアウトバウンドパケットを確認します。このリスナーのコードも簡単です。
【リスナーコード】
private void Start()
{
m_discoverListener = new UdpClient(DiscoverPort);
m_discoverListener.BeginReceive(DiscoverCallback, m_discoverListener);
}
private void DiscoverCallback(IAsyncResult result)
{
try
{
var ep = new IPEndPoint(IPAddress.Any, DiscoverPort);
var data = m_discoverListener.EndReceive(result, ref ep);
// filter out what we send
var add = AddressWithoutPort(ep.Address);
if (add == m_local.ToString()) return;
// parse discover response
// [clipped for clarity]
}
finally
{
m_discoverListener.BeginReceive(DiscoverCallback, m_discoverListener);
}
}
- 同じネットワーク上の別のPCで実行されているWiresharkは、(上から)検出要求パケットを認識します
- Wiresharkも応答を確認しているため、「検出された」デバイスもそれを確認しています。
- AndroidデバイスのUDPリスナーが応答パケットを受信していません
私が考えることができるデバイス間の唯一の大きな違いは(プラットフォームを実装しているさまざまなOEMを除いて)、G2にはセルラー無線が組み込まれているのに対し、GalaxyTabには組み込まれていないことです。私の特定のテストケースでは、電話にSIMカードがないため、セルラー接続は確立されていません。上記のコードは、WiFiネットワーク上にあるローカルエンドポイントを明示的に使用していることに注意してください。
特にまたは一般的にAndroidプラットフォームの古い実装でG2のUDPに既知の問題がありますか?