我正试图在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中发生,但是无论如何都应该隐式设置。
其他非常奇怪的观察:
[听众代码]
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);
}
}
我能想到的设备之间唯一的主要差异(实现平台的不同OEM除外)是G2内置蜂窝无线电而Galaxy Tab没有。在我的具体测试案例中,我手机中没有SIM卡,因此没有蜂窝连接。请注意,上面的代码明确使用了WiFi网络上的本地端点。
G2上是否存在UDP的已知问题,特别是在Android平台的较旧实现上?
答案 0 :(得分:1)
由于所讨论的UDP响应来自设备上的微控制器而花了一些工作,我想绝对确定它不是微端的问题(尽管我怀疑它不是) 。我为微控制器设备创建了一个基于PC的模拟器,用于处理我的Android UDP请求并发回与微控制器完全相同的UDP响应,然后使用Wireshark验证所有流量都很好。
最终结果是我看到他与模拟器完全相同的行为。 Galaxy Tab 7和10设备接收UDP响应没问题。 HTC G2永远不会。这使我得出以下结论之一:
a)HTC G2特别有一个实施错误,阻止它接收(或至少传递)网络上的UDP广播
或
b)较旧的Android版本有他的错误。
直到我找到与G2(v2.3)相同Android版本的不同硬件,我才知道是哪种情况。在任何一种情况下,这都是一个错误,使得这个(以及可能的其他)硬件无法用于我的特定解决方案。
答案 1 :(得分:0)
我在市场上有几个基于UDP通信的应用程序。
我遇到HTC手机无法接收其他设备发送的UDP广播数据包的问题...如果从同一台设备发送,则数据包到达。
所以,我认为问题出在HTC上,我在网上找到了一个可能的解决方案(即使我还没试过):
http://www.flattermann.net/2010/09/fix-udp-broadcasts-on-htc-phones-running-stock-firmware/