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 是问题所在。

另外两个陷阱:

  1. 服务发现通常有两个步骤:获取服务名称,然后获取其信息。在某些 api 中,您注册不同的侦听器以获取名称而不是获取信息的侦听器。一些 api 还要求您在获得名称后调用 resolve service 之类的东西,这将明确地获取信息。虽然不确定 Kali...

  2. 内置 Android WiFi(不是 WiFi 直连)API 在大多数低于 6.0(或者可能是 7,我忘记了)的设备上无法用于检索信息。特别是,在旧设备上,您可以获取名称,但无法获取信息,因为实现中存在多年的错误,并且 Google 没有解决。这就是为什么我建议您先尝试 Android 到 Android。只是为了排除您的特定 android 设备无法正常工作的可能性。