0

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に既知の問題がありますか?

4

2 に答える 2

1

問題のUDP応答はデバイス上のマイクロコントローラーからのものであるため、少し作業が必要でした。マイクロエンドで問題が発生していないことを絶対に確認したかったのです(問題ではなかったと思いますが)。Android UDP要求を処理し、マイクロコントローラーとまったく同じUDP応答を返すマイクロコントローラーデバイス用のPCベースのシミュレーターを作成し、Wiresharkですべてのトラフィックが正常に表示されることを確認しました。

最終的な結果として、彼はシミュレーターとまったく同じ動作をしていることがわかります。Galaxy Tab 7および10デバイスは、UDP応答を問題なく受信します。HTCG2は決してしません。これにより、次のいずれかが当てはまると結論付けることができます。

a)HTC G2には、ネットワーク上でUDPブロードキャストを受信(または少なくとも通過)できないようにする実装バグが特にあります。

また

b)古いAndroidビルドにはバグがあります。

G2(v2.3)と同じAndroidバージョンの別のハードウェアを見つけるまで、どちらが当てはまるかわかりません。いずれにせよ、これはこの(そして潜在的に他の)ハードウェアを私の特定のソリューションで使用できなくするバグです。

于 2012-04-17T16:11:39.590 に答える
0

私はUDP通信に基づいて市場にいくつかのアプリケーションを持っています。

HTC電話が別のデバイスから送信されたUDPブロードキャストパケットを受信しないという問題があります...同じデバイスから送信された場合、パケットが到着します。

だから、私は問題がHTCにあると思います、そして私はオンラインで可能な解決策を見つけました(私はそれを試していませんが):

http://www.flattermann.net/2010/09/fix-udp-broadcasts-on-htc-phones-running-stock-firmware/

于 2013-08-27T11:11:35.543 に答える