【问题标题】:UDP broadcast packets not received in sleep mode睡眠模式下未收到 UDP 广播数据包
【发布时间】:2012-03-10 22:14:52
【问题描述】:

我的 Android 应用程序会定期在 WiFi LAN 上发送和接收 UDP 广播消息。显示屏打开时,一切正常,所有消息都正确发送和接收。但是,当显示器进入睡眠状态时,应用程序会停止接收 UDP 广播消息(但仍会发送它们)。

获取 WiFiLock(以及多播锁定)似乎没有任何区别,我的 wifi 睡眠策略设置为 WIFI_SLEEP_POLICY_NEVER。

这是 Android 2.3.3 和 2.3.5(三星 Galaxy SII 手机)上的问题,但在运行 cyanogen mod 和 android 2.3.7 的旧 HTC Hero 上不是问题。

有没有其他人遇到过这个问题并找到了解决方案?

【问题讨论】:

  • 你在哪里设置你的UDPSocket?在 Activity 或 Service 中?
  • 服务内部。我们也在一个 Activity 中对其进行了测试,没有任何区别。
  • 您从InputStream 读取到“-1”字节,表示流已结束?
  • 不,DatagramChannel 上的 receive 函数不会返回(它被阻止)。一旦设备进入睡眠状态,数据包就会停止到达。
  • 如何让 UDP 在三星 Galaxy 上运行?我有这个问题:stackoverflow.com/questions/11358552/…

标签: android android-wifi android-networking


【解决方案1】:

我用这个:

WifiManager wifi;
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock wifilock = wifi.createMulticastLock("just some tag text");
wifilock.acquire();

清单:

permission android:name="android.permission.CHANGE_WIFI_MULTICAST_STATE" 

【讨论】:

    【解决方案2】:

    这个 Google Groups 线程解决了这个问题:

    https://groups.google.com/forum/?fromgroups=#!topic/android-platform/OpbSdp9FTmA

    这与某些芯片组和深度睡眠有关。基本上,驱动程序检测设备何时进入深度睡眠并关闭 UDP 广播接收。根据我的经验,UDP 发送仍然有效,并且设备上的 UDP 发送/侦听也会听到数据包,但它是一个幽灵,设备实际上是聋的。

    以下建议是我使用的:

    1. 获取 PARTIAL_WAKE_LOCK,并在屏幕关闭时捕获。然后禁用并重新启用wifi。这是有效的,因为过滤器 仅在屏幕关闭时打开,因此使用 屏幕关闭将使其继续工作,直到屏幕再次关闭。这 是我们在找到解决方案 (1) 之前所做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      相关资源
      最近更新 更多