我正在尝试通过Wi-Fi直接宣传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应用程序的例子吗?
答案 0 :(得分:1)
我怀疑问题不在Android端,因为我已经获得了WiFi直接服务发现,可以在2个Android设备之间使用额外的文本信息。如果内存对我有用,以下是您将在两个设备上运行的示例活动:
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设备上存在某些功能的可能性。