我在 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?
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
。