我如何强制 android WiFi Direct 组所有者使用 2.4 GHz 而不是 5 GHz
How do I force android WiFi Direct group owner to use 2.4 GHz instead of 5 GHz
我一直在尝试使用 WiFi Direct 将 WiFi 旧设备连接到我的组所有者。旧设备仅支持 2.4 GHz,因此当我尝试从设备扫描 AP 时,它们找不到 android phone 组所有者。但是,我确实从我的桌面和其他设备上看到了组所有者。我在我的 Linux 机器上做了一个 iw dev wlo1 scan
,我能看到的唯一区别是组所有者的频率是 freq: 5500
。如果我将 android 设备置于 AP 热点模式,频率切换到 2.4 GHz,设备也会在扫描时发现它。
我可以在代码中切换波段吗?有一个构建器 class android.net.wifi.p2p.WifiP2pConfig.Builder https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pConfig.Builder 似乎具有此功能但我无法访问它,因为它是新版本 API 级别29. 任何建议将不胜感激,我不明白为什么波段无法设置。
用于创建群主:
private void createGroupOwner() {
manager.createGroup(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(MainActivity.this, "Group Created", Toast.LENGTH_SHORT).show();
manager.requestGroupInfo(channel, getGroupOwner());
}
@Override
public void onFailure(int reason) {
Toast.makeText(MainActivity.this, "Failed to connect", Toast.LENGTH_SHORT).show();
}
});
}
我想添加一个配置,例如 manager.createGroup(channel, config, ...
,但似乎无法在 API < 29 的配置中设置频段。我试过低端Android 设备和设备使用 2.4GHz 的 WiFi Direct 网络,但在高端设备上使用 5GHz。
您可以通过更改其运行的信道来更改 Group SoftAP 的频率。
2.4GHz 频段使用 1-11 个频道(取决于国家/地区)。
5GHz频段使用32及以上
您可以通过使用反射访问隐藏函数 setWifiP2pChannels()
来实现。
这是我用来设置 wifi 频道的代码:
Method setWifiP2pChannels = wifiP2pManager.getClass()
.getMethod("setWifiP2pChannels", WifiP2pManager.Channel.class, int.class, int.class, WifiP2pManager.ActionListener.class);
setWifiP2pChannels.invoke(wifiP2pManager, p2pChannel, 0, channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.d(TAG, "Changed channel (" + channel + ") succeeded");
}
@Override
public void onFailure(int reason) {
Log.e(TAG, "Changed channel (" + channel + ") failed");
}
});
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
Log.e(TAG, "Changed channel (" + channel + ") failed(EXCEPTION) ", e);
}
确保群组 AP 为 运行,然后再更改频道。
saikrishna279 引导我朝着正确的方向前进。但是,在更改频道之前创建 AP 对我不起作用。忽略了频率变化。
像这样调整频率后创建群主:
try {
int channel_setting = 1;
Method setWifiP2pChannels = manager.getClass().getMethod("setWifiP2pChannels", WifiP2pManager.Channel.class, int.class, int.class, WifiP2pManager.ActionListener.class);
setWifiP2pChannels.invoke(manager, channel, 0, channel_setting, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
createGroupOwner();
Log.d(TAG, "Changed channel (" + channel + ") succeeded"); // change the channel if it does not work
}
@Override
public void onFailure(int reason) {
// TODO enter log here
Toast.makeText(_activity, "Failed to change to 2.4GHz", Toast.LENGTH_SHORT).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
这避免了任何不一致,每次都给我一个 2GHz 的响应,运行 sudo iw dev wlo1 scan | grep -B 10 -A 20 "SSID: DIRECT"
在终端中查看更改。
对我来说,使用反射只适用于 Android 10 岁或以上。事实证明,WifiP2pConfig 有一个构建器 API,可让您按照自己的喜好配置网络:https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pConfig.Builder#build()
这是一个使用示例:
WifiP2pConfig.Builder configBuilder = new WifiP2pConfig.Builder();
configBuilder.setNetworkName("DIRECT-your-network");
configBuilder.setPassphrase("your-pwd");
configBuilder.setGroupOperatingFrequency(WifiP2pConfig.GROUP_OWNER_BAND_2GHZ);
WifiP2pConfig config = configBuilder.build();
mManager.createGroup(mChannel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(context, "Group creation started", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int reason) {
Toast.makeText(context, "P2P group creation failed. Retry. err_code: " + reason,
Toast.LENGTH_SHORT).show();
}
});
我一直在尝试使用 WiFi Direct 将 WiFi 旧设备连接到我的组所有者。旧设备仅支持 2.4 GHz,因此当我尝试从设备扫描 AP 时,它们找不到 android phone 组所有者。但是,我确实从我的桌面和其他设备上看到了组所有者。我在我的 Linux 机器上做了一个 iw dev wlo1 scan
,我能看到的唯一区别是组所有者的频率是 freq: 5500
。如果我将 android 设备置于 AP 热点模式,频率切换到 2.4 GHz,设备也会在扫描时发现它。
我可以在代码中切换波段吗?有一个构建器 class android.net.wifi.p2p.WifiP2pConfig.Builder https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pConfig.Builder 似乎具有此功能但我无法访问它,因为它是新版本 API 级别29. 任何建议将不胜感激,我不明白为什么波段无法设置。
用于创建群主:
private void createGroupOwner() {
manager.createGroup(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(MainActivity.this, "Group Created", Toast.LENGTH_SHORT).show();
manager.requestGroupInfo(channel, getGroupOwner());
}
@Override
public void onFailure(int reason) {
Toast.makeText(MainActivity.this, "Failed to connect", Toast.LENGTH_SHORT).show();
}
});
}
我想添加一个配置,例如 manager.createGroup(channel, config, ...
,但似乎无法在 API < 29 的配置中设置频段。我试过低端Android 设备和设备使用 2.4GHz 的 WiFi Direct 网络,但在高端设备上使用 5GHz。
您可以通过更改其运行的信道来更改 Group SoftAP 的频率。
2.4GHz 频段使用 1-11 个频道(取决于国家/地区)。
5GHz频段使用32及以上
您可以通过使用反射访问隐藏函数 setWifiP2pChannels()
来实现。
这是我用来设置 wifi 频道的代码:
Method setWifiP2pChannels = wifiP2pManager.getClass()
.getMethod("setWifiP2pChannels", WifiP2pManager.Channel.class, int.class, int.class, WifiP2pManager.ActionListener.class);
setWifiP2pChannels.invoke(wifiP2pManager, p2pChannel, 0, channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Log.d(TAG, "Changed channel (" + channel + ") succeeded");
}
@Override
public void onFailure(int reason) {
Log.e(TAG, "Changed channel (" + channel + ") failed");
}
});
} catch (IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
Log.e(TAG, "Changed channel (" + channel + ") failed(EXCEPTION) ", e);
}
确保群组 AP 为 运行,然后再更改频道。
saikrishna279 引导我朝着正确的方向前进。但是,在更改频道之前创建 AP 对我不起作用。忽略了频率变化。
像这样调整频率后创建群主:
try {
int channel_setting = 1;
Method setWifiP2pChannels = manager.getClass().getMethod("setWifiP2pChannels", WifiP2pManager.Channel.class, int.class, int.class, WifiP2pManager.ActionListener.class);
setWifiP2pChannels.invoke(manager, channel, 0, channel_setting, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
createGroupOwner();
Log.d(TAG, "Changed channel (" + channel + ") succeeded"); // change the channel if it does not work
}
@Override
public void onFailure(int reason) {
// TODO enter log here
Toast.makeText(_activity, "Failed to change to 2.4GHz", Toast.LENGTH_SHORT).show();
}
});
} catch (Exception e) {
e.printStackTrace();
}
这避免了任何不一致,每次都给我一个 2GHz 的响应,运行 sudo iw dev wlo1 scan | grep -B 10 -A 20 "SSID: DIRECT"
在终端中查看更改。
对我来说,使用反射只适用于 Android 10 岁或以上。事实证明,WifiP2pConfig 有一个构建器 API,可让您按照自己的喜好配置网络:https://developer.android.com/reference/android/net/wifi/p2p/WifiP2pConfig.Builder#build() 这是一个使用示例:
WifiP2pConfig.Builder configBuilder = new WifiP2pConfig.Builder();
configBuilder.setNetworkName("DIRECT-your-network");
configBuilder.setPassphrase("your-pwd");
configBuilder.setGroupOperatingFrequency(WifiP2pConfig.GROUP_OWNER_BAND_2GHZ);
WifiP2pConfig config = configBuilder.build();
mManager.createGroup(mChannel, config, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Toast.makeText(context, "Group creation started", Toast.LENGTH_SHORT).show();
}
@Override
public void onFailure(int reason) {
Toast.makeText(context, "P2P group creation failed. Retry. err_code: " + reason,
Toast.LENGTH_SHORT).show();
}
});