WiFi-Direct on JellyBean, WPA Supplicant messed up

so a couple of months ago I've started developing some WiFi-Direct applications. A few days ago, I updated both of my Galaxy Nexus to Jelly Bean (4.1.x) and tested my applications, but it seems like there's something messed up again.. It was already a pain in the ass to get the main functionality set up on ICS, but now it does not work anymore.

All i get is something like this in my 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

The "Invitation dialog" pops up correctly at the second phone, and "sometimes" (random) it even works, but only in every fifth try or something. So the logcat tells me, as I'm no professional with android-intern codes, that the negotiation simply fails, the device gets lost for a brief moment, and is then discovered again, seems all kinda messed up.

My invitation is sent out like this:

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);
            }
        }
    });
}

I've read a lot on wifi direct on android, and it's been working fine until I updated the phones to jelly bean.. anyone knows, what could be wrong? If you need more code samples or any specific part of the code, just tell me, as I don't know what could be reliable for this.

Thank you for your help.

EDIT:

Changed the WifiP2pConfig.wps.setup method to "display", which resulted in device #1 displaying a PIN code, device #2 popping up a dialog with an input field - after entering the correct pin this is what logcat told me:

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

Interesting would be: 08-31 15:13:43.491: W/wpa_supplicant(384): p2p-p2p0-3: Could not connect to kernel driver

I think. Looks like a bug in Android's own wifi-direct-framework to me?

Answers


To mark this question as answered, I'll just copy my "solution" to this problem:

Seems like group formation only fails if you're in another wifi network, like in your home wifi or such.. so Android fails to disable it - thus fails to connect via WiFi Direct.

I had to make sure the devices were not in a wifi network.


Android updated Wi-Fi Direct API with Jelly Bean in API level 16. As you already know the core API was first added along with ICS in API level 14. Here you can find the added classes regarding Wi-Fi Direct,

WifiP2pDnsSdServiceInfo
WifiP2pDnsSdServiceRequest
WifiP2pServiceInfo
WifiP2pServiceRequest
WifiP2pUpnpServiceInfo
WifiP2pUpnpServiceRequest

Some classes here use WifiP2pManager class as parameter. You better take a look at them yourself:

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

IMO your application might be corrupted, manipulated or what-so-ever after this update in API 16. I see that you have created your own method for sending invitation to other peer, altough this is not really needed. Peers get invitation automatically in Wi-Fi Direct. Thus, you can leave it handle the invitation process itself. Once again, I suggest you take a look at here unless you did it before.


Need Your Help

How do I do a faster MySQL Import?

mysql import mysqldump

We need to dump existing production data and then import it to a development DB for final rounds of testing.

Facebook Pages API Post Without User Login

php facebook facebook-graph-api

I have created a FB App to publish posts as page from another site.