android - 如何强制 android WiFi Direct 组所有者使用 2.4 GHz 而不是 5 GHz
问题描述
我一直在尝试使用 WiFi Direct 将 WiFi 旧设备连接到我的群组所有者。旧设备仅支持 2.4 GHz,因此当我尝试从设备扫描 AP 时,他们找不到 android 手机组所有者。但是,我确实从我的桌面和其他设备上看到了组所有者。我iw dev wlo1 scan
在我的 Linux 机器上做了一个,我能看到的唯一区别是组所有者的频率是freq: 5500
. 如果我将 android 设备置于 AP 热点模式,频率会切换到 2.4 GHz,设备也会在扫描时发现这一点。
我可以在代码中切换波段吗?有一个构建器类 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 正在运行。
推荐阅读
- json - 我们可以自动化 kubectl 推荐吗
- ftp - 我们可以使用 FTP 在 apache-beam 中导入数据吗?
- c++ - 具有全套五规则的简单链表
- python - 尝试使用 Python 登录连接到我的 Hauwei B618 路由器的驱动器
- vue.js - 如何使用 Vue js 将通知标记为已读?
- php - 在 PHP 中找不到替换图像时如何显示替换图像?
- c++ - 如何使用赋值 = 运算符初始化对象?
- r - 如何根据索引从向量中删除项目
- javascript - ReactJS - 在执行下一个代码之前等待多个 setState 完成
- javascript - 如何在新网站 HTML 和 JS 上单击项目