通过Wi-Fi Direct连接两个设备

4
我正在尝试通过Wi-Fi Direct连接两个Android设备。 在我的应用程序中,我硬编码了另一个设备的MAC地址,并调用了connect方法。我假设两个设备都开启了Wi-Fi Direct。这是我使用的代码:
包名:com.abc;
import android.app.Activity;
import android.content.Context;
import android.content.IntentFilter;
import android.net.wifi.WpsInfo;
import android.net.wifi.p2p.WifiP2pConfig;
import android.net.wifi.p2p.WifiP2pManager;
import android.net.wifi.p2p.WifiP2pManager.Channel;
import android.os.Bundle;
import android.widget.Toast;

public class WiFiDirectActivity extends Activity {
/** Called when the activity is first created. */
protected WifiP2pManager manager;
protected Channel channel;
public WifiP2pConfig config ;
protected final IntentFilter intentFilter = new IntentFilter();

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    intentFilter.addAction   (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION);
    intentFilter
            .addAction(WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION);
    manager = (WifiP2pManager) getSystemService(Context.WIFI_P2P_SERVICE);
    channel = manager.initialize(this, this.getMainLooper(), null);
    config = new WifiP2pConfig();
    config.deviceAddress = "78:d6:f0:ab:d9:da";
    config.groupOwnerIntent = 0;
    config.wps.setup = WpsInfo.PBC;

    manager.connect(channel, config, new WifiP2pManager.ActionListener(){
        @Override
        public void onSuccess() {
            Toast.makeText(getApplicationContext(), "success", Toast.LENGTH_LONG);

        }

        @Override
        public void onFailure(int reason) {
            Toast.makeText(getApplicationContext(), "Failed", Toast.LENGTH_LONG);

        }
    });




}

但它没有连接。我的实现有什么问题?


请分享您的Logcat消息,这样我们就可以了解发生了什么。 - Chucky
2个回答

2

我有一个类似的代码在运行,主要的区别是:

  • 我在搜索对等设备之前调用获取设备地址的函数(如果这么做,那么你需要将WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION添加到意图过滤器组中)
  • 我没有设置config.groupOwnerIntent

WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = this.address;
config.wps.setup = WpsInfo.PBC;

1

在onResume()中注册一个广播接收器并重写它。记得在onPause()中取消注册。

private class WiFiDirectBroadcastReceiver extends android.content.BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            //TODO
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            //TODO
        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            //TODO
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            //TODO
        }
    }
}

然后尝试首先调用discoverPeers()。
mWifiP2pManager.discoverPeers(Channel mChannel, ActionListener mActionListener);

如果discoverPeers()找到了对等设备,将会触发WIFI_P2P_PEERS_CHANGED_ACTION事件。
我们可以在BroadcastReceiver中的WIFI_P2P_PEERS_CHANGED_ACTION事件中调用requestPeers()。
mWifiP2pManager.requestPeers(Channel mChannel, WifiP2pManager.PeerListListener);

所以我们的 BroadcastReceiver 现在看起来像这样:
private class WiFiDirectBroadcastReceiver extends android.content.BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            //TODO
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            mWifiP2pManager.requestPeers(mChannel , pl);
        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            //TODO
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            //TODO
        }
    }
}

要实现WifiP2pManager.PeerListListener,你需要重写onPeersAvailable(WifiP2pDeviceList peers)方法。

在onPeersAvailable()方法中,参数wifiP2pDeviceList表示你发现的对等设备。

我们需要一个UI对象来选择要连接的设备,所以我在这里使用了spinner。

你也可以使用listView或其他东西。

private List<WifiP2pDevice> mPeers = new ArrayList<WifiP2pDevice>();
spinnerAdapter = new WiFiPeerListAdapter(this, R.layout.row_devices, mPeers);
...
@Override
public void onPeersAvailable(WifiP2pDeviceList wifiP2pDeviceList) {
    mPeers.clear();
    mPeers.addAll(wifiP2pDeviceList.getDeviceList());
    spinnerAdapter.notifyDataSetChanged();
}

最终我们可以连接到一个设备

WifiP2pDevice device = spinnerAdapter.getItem((int) mSpinner.getSelectedItemId());
WifiP2pConfig config = new WifiP2pConfig();
config.deviceAddress = device.deviceAddress;
config.wps.setup = WpsInfo.PBC;
mWifiP2pManager.connect(mChannel, config, mActionListener);

在两个设备连接之后,将触发BroadcastReceiver操作WIFI_P2P_CONNECTION_CHANGED_ACTION。因此我们可以在这里进行一些操作。

现在我们的BroadcastReceiver看起来像:

private class WiFiDirectBroadcastReceiver extends android.content.BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (WifiP2pManager.WIFI_P2P_STATE_CHANGED_ACTION.equals(action)) {
            //TODO
        } else if (WifiP2pManager.WIFI_P2P_PEERS_CHANGED_ACTION.equals(action)) {
            mWifiP2pManager.requestPeers(mChannel , pl);
        } else if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
            NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
            if (networkInfo != null) {
                Log.d(TAG,networkInfo.toString());
                if (networkInfo.isConnected()) {
                    mWifiP2pManager.requestConnectionInfo(mChannel, WifiP2pManager.ConnectionInfoListener);
                }
            }
        } else if (WifiP2pManager.WIFI_P2P_THIS_DEVICE_CHANGED_ACTION.equals(action)) {
            //TODO
        }
    }
}

顺便提一下,在WIFI_P2P_CONNECTION_CHANGED_ACTION登录操作中,将会得到类似于这样的内容

NetworkInfo: type: WIFI_P2P[], state: UNKNOWN/IDLE, reason: (unspecified), extra: (none), roaming: false, failover: false, isAvailable: true, simId: 0

现在我们需要实现WifiP2pManager.ConnectionInfoListener并覆盖其抽象方法onConnectionInfoAvailable(WifiP2pInfo info),以便请求连接信息(requestConnectionInfo())。
private WifiP2pInfo p2pInfo;
@Override
public void onConnectionInfoAvailable(final WifiP2pInfo info) {
    p2pInfo = info;
    mWifiP2pManager.requestGroupInfo(mChannel, WifiP2pManager.GroupInfoListener);
}

我们需要再次实现WifiP2pManager.GroupInfoListener并覆盖onGroupInfoAvailable(WifiP2pGroup group)方法。

@Override
public void onGroupInfoAvailable(WifiP2pGroup wifiP2pGroup) {
    String log;
    if(wifiP2pGroup.isGroupOwner()) {
        log = "I am GO";
    }else{
        log = "I am not GO";
    }
    Log.d(TAG, log);
}

现在我们几乎已经获取了这两个设备的所有信息

尽情享受吧


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接