如何为 Wi-Fi P2P 网络绑定ProcessToNetwork?

问题描述 投票:0回答:1

我在 Android 上使用 Wi-Fi P2P 网络来连接到 IoT 设备。连接始终建立。设备运行 DHCP 服务器:

private class WiFiDirectBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
    String action = intent.getAction();
    if (WifiP2pManager.WIFI_P2P_CONNECTION_CHANGED_ACTION.equals(action)) {
    NetworkInfo networkInfo = intent.getParcelableExtra(WifiP2pManager.EXTRA_NETWORK_INFO);
    PRINTF("WiFiDirect WIFI_P2P_CONNECTION_CHANGED_ACTION " + networkInfo.getState());
    if (networkInfo.getState() == NetworkInfo.State.CONNECTED) {
        mManager.requestConnectionInfo(mChannel, new WifiP2pManager.ConnectionInfoListener() {
            @Override
            public void onConnectionInfoAvailable(WifiP2pInfo info) {
                //This function is reached. The device can be pinged to
                //info.groupOwnerAddress.getHostAddress()
            }
        });
    }
}

我想将进程绑定到这个P2P网络。我添加了一个网络注册回调,在热点(没有 P2P 功能)的情况下调用它,但 Wi-Fi P2P 永远不会调用它:

NetworkRequest nr = new NetworkRequest.Builder()
.addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
.addCapability(NetworkCapabilities.NET_CAPABILITY_WIFI_P2P).build();
mConnectivityManager.registerNetworkCallback(nr, new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        super.onAvailable(network);
        //This is never being called for P2P
        mConnectivityManager.bindProcessToNetwork(network);
    }
});

我错过了什么吗?

否则,我如何才能设法“向上”并从 WiFiDirectBroadcastReceiver 中的 NetworkInfo 检索 Network

android android-wifi wifi-direct wifip2p hotspot
1个回答
0
投票

NetworkRequest.Builder
将附带一组默认的
NetworkCapabilities
link。最有可能发生的情况是,这些功能之一导致您的
NetworkRequest
被传递到
mConnectivityManager.registerNetworkCallback
与您的预期网络不匹配。

我的建议有两点:首先使用

NetworkRequest.Builder#clearCapabilities()
link:

清除所有默认功能

完全清除此构建器中的所有

NetworkCapabilities
例如,甚至删除默认设置的功能 对象被构造。还删除任何禁止的设置 能力。

其次,仅将您实际需要的功能(例如,在您的情况下无需传入传输类型)传递给

NetworkRequest.Builder
对象:

NetworkRequest nr = new NetworkRequest.Builder()
.clearCapabilities()
.addCapability(NetworkCapabilities.NET_CAPABILITY_WIFI_P2P).build();
mConnectivityManager.registerNetworkCallback(nr, new ConnectivityManager.NetworkCallback() {
    @Override
    public void onAvailable(Network network) {
        super.onAvailable(network);
        //This should hopefully be called now.
        mConnectivityManager.bindProcessToNetwork(network);
    }
});

将来,如果您拥有多个 Wi-Fi P2P 网络,您始终可以使用

NetworkSpecifier
link 在它们之间进行选择。

最后,您可以使用

adb shell dumpsys connectivity | grep -i NetworkAgentInfo
列出当前可用的网络(例如您的 Wi-Fi P2P 网络)。您可以在
nc
对象中查看这些网络的网络功能。您可以手动预期这些功能,并确保您的
NetworkRequest
对该网络的功能“满意”。例如,如果您传递具有功能
INTERNET
的请求,而您感兴趣的网络不具备该功能,则它永远不会被选择,因为它不满足您的
NetworkRequest

© www.soinside.com 2019 - 2024. All rights reserved.