0

我正在尝试在 Mono for Android 下接收 UDP 广播,但没有看到数据进入。这有点令人困惑,因为它在我拥有的 Galaxy Tab 7 和 Galaxy Tab 10 (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" />

尽管这发生在 Debug 中,但无论如何都应该隐式设置。

其他非常奇怪的观察:

  • 同样,这在另一种类型的设备上工作得很好
  • 监听 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 内置了蜂窝无线电,而 Galaxy Tab 没有。但是,在我的特定测试案例中,我的手机中没有 SIM 卡,因此没有建立蜂窝连接。请注意,上面的代码明确使用 WiFi 网络上的本地端点。

G2 上的 UDP 是否存在已知问题,特别是或一般在 Android 平台的较旧实现上?

4

2 回答 2

1

由于有问题的 UDP 响应来自设备上的微控制器,因此需要做一些工作,我想绝对确定这不是微端的问题(尽管我怀疑不是)。我为微控制器设备创建了一个基于 PC 的模拟器,它处理我的 Android UDP 请求并发送回与微控制器完全相同的 UDP 响应,然后使用 Wireshark 验证所有流量看起来都很好。

最终结果是我看到他与模拟器完全相同的行为。Galaxy Tab 7 和 10 设备接收 UDP 响应没有问题。HTC G2 从来没有。这使我得出结论,以下情况之一是正确的:

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 回答