【问题标题】:WiFi-Direct on JellyBean, WPA Supplicant messed upJellyBean 上的 WiFi-Direct,WPA 请求者搞砸了
【发布时间】:2012-08-31 13:13:03
【问题描述】:

几个月前,我开始开发一些 WiFi-Direct 应用程序。几天前,我将我的 Galaxy Nexus 都更新为 Jelly Bean (4.1.x) 并测试了我的应用程序,但似乎又出现了问题。获得主要功能集已经很痛苦了在 ICS 上,但现在它不再工作了。

我在 logcat 中得到的只是这样的东西:

/wpa_supplicant(  392): p2p0: P2P-PROV-DISC-PBC-REQ a2:0b:ba:xy:zz:xx p2p_dev_addr=a2:0b:ba:xy:zz:xx pri_dev_type=10-0050F204-x name='Android_e9f0' config_methods=0x188 dev_capab=0x27 group_capab=0x0
I/wpa_supplicant(  392): p2p0: P2P-DEVICE-FOUND a2:0b:ba:xy:zz:xx p2p_dev_addr=a2:0b:ba:xy:zz:xx pri_dev_type=10-0050F204-5 name='Android_e9f0' config_methods=0x188 dev_capab=0x27 group_capab=0x0
I/wpa_supplicant(  392): p2p0: P2P-GO-NEG-REQUEST a2:0b:ba:xx:zz:xy dev_passwd_id=4
I/wpa_supplicant(  392): p2p0: P2P-FIND-STOPPED 
I/wpa_supplicant(  392): p2p0: P2P-GO-NEG-FAILURE status=7
W/Netd    (  120): No subsystem found in netlink event
D/NetlinkEvent(  120): Unexpected netlink message. type=0x11
I/wpa_supplicant(  392): p2p0: P2P-DEVICE-LOST p2p_dev_addr=a2:0b:ba:xx:zz:xy
I/wpa_supplicant(  392): p2p0: P2P-DEVICE-FOUND a2:0b:ba:xx:zz:xy p2p_dev_addr=a2:0b:ba:xx:zz:xy pri_dev_type=10-0050F204-5 name='Android_e9f0' config_methods=0x188 dev_capab=0x27 group_capab=0x0

“邀请对话框”在第二部手机上正确弹出,并且“有时”(随机)它甚至可以工作,但仅在每五次尝试时才会出现。所以 logcat 告诉我,由于我不是 android-intern 代码的专业人士,所以协商根本就失败了,设备丢失了一小会儿,然后再次被发现,似乎有点混乱。

我的邀请是这样发出的:

public void onPeersAvailable(WifiP2pDeviceList peers) {
    if (isInvitationSent)
        return;
    for (WifiP2pDevice dev : peers.getDeviceList()) {
        WifiP2pConfig c = new WifiP2pConfig();
        c.deviceAddress = dev.deviceAddress;
        c.wps.setup = WpsInfo.PBC;

        if (initiator
                && !isInvitationSent
                && WiFiSupport.compareMacAddressesInsensitive(MAC_ADDRESS,
                        dev.deviceAddress)) {
            isInvitationSent = true;
            sendInvitation(c);
        }
    }
}

private void sendInvitation(final WifiP2pConfig config) {
    log("Sending invitation to " + config.deviceAddress);
    mWifiManager.connect(mChannel, config, new ActionListener() {
        @Override
        public void onSuccess() {
            log("Invitation sent!");
        }

        @Override
        public void onFailure(int reason) {
            log("Invitation failed!");
            Toast.makeText(getApplicationContext(), "Could not connect to peer, reason:"+reason, Toast.LENGTH_LONG).show();
            if (!retryChannel) {
                log("Retrying to send invitation.");
                retryChannel = true;
                sendInvitation(config);
            }
        }
    });
}

我已经阅读了很多关于 wifi direct 在 android 上的内容,并且在我将手机更新为果冻豆之前它一直运行良好。任何人都知道,可能出了什么问题?如果您需要更多代码示例或代码的任何特定部分,请告诉我,因为我不知道什么是可靠的。

感谢您的帮助。

编辑:

将 WifiP2pConfig.wps.setup 方法更改为“显示”,这导致设备 #1 显示 PIN 码,设备 #2 弹出一个带有输入字段的对话框 - 输入正确的 pin 后,这是 logcat 告诉我的:

08-31 15:13:28.241: I/wpa_supplicant(384): p2p0: P2P-GO-NEG-SUCCESS 
08-31 15:13:28.241: I/wpa_supplicant(384): rfkill: Cannot open RFKILL control device
08-31 15:13:29.850: W/wpa_supplicant(384): p2p-p2p0-3: Could not connect to kernel driver
08-31 15:13:30.264: E/wpa_supplicant(384): Using interface p2p-p2p0-3 with hwaddr a2:0b:ba:x:y:z and ssid 'DIRECT-ps-Android_e9f0'
08-31 15:13:30.491: I/wpa_supplicant(384): p2p-p2p0-3: CTRL-EVENT-CONNECTED - Connection to a2:0b:ba:x:y:z completed (auth) [id=0 id_str=]
08-31 15:13:43.491: I/wpa_supplicant(384): p2p0: P2P-GROUP-FORMATION-FAILURE 
08-31 15:13:43.491: I/wpa_supplicant(384): p2p0: P2P-GROUP-REMOVED p2p-p2p0-3 GO
08-31 15:13:43.491: W/wpa_supplicant(384): p2p-p2p0-3: Could not connect to kernel driver
08-31 15:13:44.061: E/wpa_supplicant(384): Failed to remove interface (ifidx=15)
08-31 15:13:44.178: W/Netd(120): No subsystem found in netlink event
08-31 15:13:44.178: D/NetlinkEvent(120): Unexpected netlink message. type=0x11
08-31 15:13:44.248: W/Netd(120): No subsystem found in netlink event
08-31 15:13:44.248: D/NetlinkEvent(120): Unexpected netlink message. type=0x11
08-31 15:13:44.280: I/wpa_supplicant(384): p2p0: P2P-DEVICE-LOST p2p_dev_addr=a2:0b:ba:x:y:z
08-31 15:13:46.155: I/wpa_supplicant(384): p2p0: P2P-DEVICE-FOUND a2:0b:ba:x:y:z p2p_dev_addr=a2:0b:ba:x:y:z pri_dev_type=10-0050F204-5 name='Android_755f' config_methods=0x188 dev_capab=0x27 group_capab=0x0

有趣的是: 08-31 15:13:43.491: W/wpa_supplicant(384): p2p-p2p0-3: 无法连接到内核驱动程序

我想。对我来说,这看起来像是 Android 自己的 wifi-direct-framework 中的错误?

【问题讨论】:

  • 似乎只有当您在另一个 wifi 网络中时,群组形成才会失败,例如在您的家庭 wifi 等中。所以 Android 无法禁用它 - 因此无法通过 WiFi Direct 连接。
  • 你找到解决办法了吗?
  • 我开发了两个 HTC One Vs(由于内存限制无法更新到 Jelly Bean)和一个 HTC One X+(有 4.1)。根据我的经验,One Vs 大部分时间都在工作,而 One X+ 会更频繁地失败。

标签: android wifi android-4.2-jelly-bean wifi-direct


【解决方案1】:

要将此问题标记为已回答,我只需将我的“解决方案”复制到此问题:

似乎只有当您在另一个 wifi 网络中(例如在您的家庭 wifi 等中)时,组形成才会失败。所以 Android 无法禁用它 - 因此无法通过 WiFi Direct 连接。

我必须确保这些设备不在 wifi 网络中。

【讨论】:

    【解决方案2】:

    Android 在 API 级别 16 中使用 Jelly Bean 更新了 Wi-Fi Direct API。正如您已经知道,核心 API 是在 API 级别 14 中首先与 ICS 一起添加的。在这里您可以找到有关 Wi-Fi Direct 的添加类,

    WifiP2pDnsSdServiceInfo
    WifiP2pDnsSdServiceRequest
    WifiP2pServiceInfo
    WifiP2pServiceRequest
    WifiP2pUpnpServiceInfo
    WifiP2pUpnpServiceRequest
    

    这里的一些类使用WifiP2pManager 类作为参数。你最好自己看看:

    http://developer.android.com/reference/android/net/wifi/p2p/nsd/package-summary.html

    在 API 16 更新后,IMO 您的应用程序可能已损坏、被操纵或其他任何情况。我看到您已经创建了自己的方法来向其他对等方发送邀请,尽管这并不是真正需要的。对等方在 Wi-Fi Direct 中自动获得邀请。因此,您可以让它自己处理邀请过程。再一次,我建议你看看here,除非你以前做过。

    【讨论】:

    • 不,我的应用程序仍然像魅力一样工作。但是在新的 JB API 中它变得更好,一些错误不再出现。尤其是那些与司机有关的,真的很难“抓住”。
    猜你喜欢
    • 2013-03-10
    • 2015-05-16
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多