Android 未发现 wi-fi p2p 服务
Android wi-fi p2p service is not discovered
我正在尝试通过 Wi-Fi direct 宣传 Bonjour 服务。这是代码:
manager.clearLocalServices(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Map<String, String> record = new HashMap<>();
record.put("qwe", "123");
WifiP2pDnsSdServiceInfo serviceInfo = WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", record);
manager.addLocalService(channel, serviceInfo, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {}
@Override
public void onFailure(int reason) {}
});
}
@Override
public void onFailure(int reason) {}
});
}
@Override
public void onFailure(int reason) {}
});
在 Kali 上 Linux 我使用 wpi_cli 发现服务
> p2p_serv_disc_req 00:00:00:00:00:00 02000001
> p2p_find
kali成功发现Android,我看到对应的信息:
P2P-DEVICE-FOUND 70:0b:c0:ac:63:11 p2p_dev_addr=70:0b:c0:ac:63:11 pri_dev_type=10-0050F204-5 name='PSP5506DUO' config_methods=0x188 dev_capab=0x25 group_capab=0x0 new=1
但未发现有关服务的以下信息。
如何确定问题出在哪一边?是Android不宣传服务,还是Kali没有发现?
还有更一般的问题 - 是否有一个 工作 wi-fi p2p 服务广告和发现 Android 应用程序的示例?
我怀疑问题不在 Android 方面,因为我已经获得 WiFi 直接服务发现功能,可以在 2 Android 设备之间使用额外的文本信息。如果没记错的话,下面是一个示例 Activity,您将在两种设备上 运行:
https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifiDirect.java
所以我诊断问题的方法是首先确保上面的代码在你的设备上工作。这将确保确实正在广播某些内容。在那之后我认为你必须怀疑 Kali 是问题所在。
另外两个陷阱:
服务发现通常有两个步骤:获取服务名称,然后获取其信息。在某些 api 中,您注册不同的侦听器以获取名称而不是获取信息的侦听器。一些 api 还要求您在获得名称后调用 resolve service
之类的东西,这将明确地获取信息。虽然不确定 Kali...
内置 Android WiFi(不是 WiFi 直连)API 在大多数低于 6.0(或者可能是 7,我忘记了)的设备上无法用于检索信息。特别是,在旧设备上,您可以获取名称,但无法获取信息,因为实现中存在多年的错误,并且 Google 没有解决。这就是为什么我建议您先尝试 Android 到 Android。只是为了排除您的特定 android 设备无法正常工作的可能性。
我正在尝试通过 Wi-Fi direct 宣传 Bonjour 服务。这是代码:
manager.clearLocalServices(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
Map<String, String> record = new HashMap<>();
record.put("qwe", "123");
WifiP2pDnsSdServiceInfo serviceInfo = WifiP2pDnsSdServiceInfo.newInstance("_test", "_presence._tcp", record);
manager.addLocalService(channel, serviceInfo, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {
manager.discoverPeers(channel, new WifiP2pManager.ActionListener() {
@Override
public void onSuccess() {}
@Override
public void onFailure(int reason) {}
});
}
@Override
public void onFailure(int reason) {}
});
}
@Override
public void onFailure(int reason) {}
});
在 Kali 上 Linux 我使用 wpi_cli 发现服务
> p2p_serv_disc_req 00:00:00:00:00:00 02000001
> p2p_find
kali成功发现Android,我看到对应的信息:
P2P-DEVICE-FOUND 70:0b:c0:ac:63:11 p2p_dev_addr=70:0b:c0:ac:63:11 pri_dev_type=10-0050F204-5 name='PSP5506DUO' config_methods=0x188 dev_capab=0x25 group_capab=0x0 new=1
但未发现有关服务的以下信息。
如何确定问题出在哪一边?是Android不宣传服务,还是Kali没有发现?
还有更一般的问题 - 是否有一个 工作 wi-fi p2p 服务广告和发现 Android 应用程序的示例?
我怀疑问题不在 Android 方面,因为我已经获得 WiFi 直接服务发现功能,可以在 2 Android 设备之间使用额外的文本信息。如果没记错的话,下面是一个示例 Activity,您将在两种设备上 运行:
https://github.com/mholzel/Dump/blob/master/NetworkServiceDiscoveryViaWifiDirect.java
所以我诊断问题的方法是首先确保上面的代码在你的设备上工作。这将确保确实正在广播某些内容。在那之后我认为你必须怀疑 Kali 是问题所在。
另外两个陷阱:
服务发现通常有两个步骤:获取服务名称,然后获取其信息。在某些 api 中,您注册不同的侦听器以获取名称而不是获取信息的侦听器。一些 api 还要求您在获得名称后调用
resolve service
之类的东西,这将明确地获取信息。虽然不确定 Kali...内置 Android WiFi(不是 WiFi 直连)API 在大多数低于 6.0(或者可能是 7,我忘记了)的设备上无法用于检索信息。特别是,在旧设备上,您可以获取名称,但无法获取信息,因为实现中存在多年的错误,并且 Google 没有解决。这就是为什么我建议您先尝试 Android 到 Android。只是为了排除您的特定 android 设备无法正常工作的可能性。