使用WiFi Direct发现对等设备的替代方法,因为这需要两台手机都运行WiFi Direct发现

3
我试图发现WiFi Direct点对点安卓设备,但只有在两台手机都运行WiFi Direct发现时才能发现对等方。我已经了解到的是,它们只有在同时扫描WiFi Direct连接时才会看到彼此。这是因为WiFi Direct的工作方式是当手机正在扫描WiFi Direct连接时,它们将与其他对等方协商访问点或从设备的角色。因此,两者都需要调用discoverPeers()来变得可发现并找到附近设备。
我想在我的应用程序中实现的是,只有一个设备启动扫描过程,并列出所有支持wifi直接的附近设备。那么如何使用wifi Direct实现这一目标呢?还有其他选择吗?
提前感谢。
3个回答

3
使用WiFiDirect无法实现您的目标。您需要在所有要连接的设备上打开WiFiDirect(通过编程或手动方式)。
但是,有一种方法可以减少发现过程的工作量。您可以使用服务发现而不是常规p2p连接
它允许仅在一个设备(客户端)上进行p2p发现。第二个设备(服务器)只是等待连接邀请。
在我们的一个应用程序中,我们遇到了一个问题:当设备进行p2p发现时,网络带宽极度降低,导致已连接的设备断开连接。
使用服务发现确实对我们有所帮助。您可以使用该代码作为示例。

通过wifip2p运行后台服务执行discoverpeers可以实现这一点。服务发现与运行后台服务执行discoverpeers相比,是否是相同的概念或更好的概念?感谢您的回答。 - Sarang S. Chaturvedi
服务发现是2P2概念的一部分。您仍需要一个后台服务来执行发现。 - Oleg Sokolov
不同之处在于-您不会发现所有附近的对等点,而是会发现一个特定的服务。该服务不会发现任何对等点,而只是等待来自对等点的连接。 - Oleg Sokolov

1
我找到的唯一选择是导航到Wi-Fi Direct设置。在Android 6.0设备上,可以这样实现:Wi-Fi -> 设置(右上角的3个点菜单) -> Wi-Fi Direct。最可能它会自行启动发现过程...
我的推断是,与蓝牙等独立功能不同,Wi-Fi Direct不是一个独立的功能。它是Wi-Fi的一部分,因此无法单独开/关。Wi-Fi P2P网络的创建始于组所有者协商,该协商仅可在支持Wi-Fi Direct的设备之间执行。当P2P组形成时,它也对Wi-Fi遗留设备可用(它像标准的ad-hoc网络一样工作,对所有Wi-Fi设备可见)。
因此,为了创建P2P网络(组),您必须与其他P2P设备进行协商,这只有在打开Wi-Fi Direct时才可能。

打开Wi-Fi Direct设置实际上会启动发现过程。但我希望只有一个设备能够识别其他设备,而不需要其他设备做任何事情。是否可以使用其他方法实现? - Sarang S. Chaturvedi
1
正如我所说的,如果没有启动发现过程,您的Wi-Fi Direct功能就会关闭。设备在组成团体之前必须处于打开状态才能相互发现。可以将其视为简单的WiFi网络扫描,用于WiFi P2P网络扫描,扫描本身将为每个设备创建这样的网络。另外可能有助于您理解的是本地WiFi IP扫描。即使其他设备的WiFi已经打开,您也无法在网络外部找到它们。 - Jakub Licznerski
谢谢您的回复和答案,但我的问题仍未解决。在服务发现期间,https://developer.android.com/training/connect-devices-wirelessly/nsd-wifi-direct.html,是否也会发生同样的事情,因为这里也调用了discoverpeers,所以在服务发现中也是同样的情况吗? - Sarang S. Chaturvedi
然后我必须运行一个后台服务,该服务无限期地运行discoverpeers函数。这会对电池寿命产生太大影响吗?这样做是否不切实际? - Sarang S. Chaturvedi
我并不完全理解这个概念,但似乎更适合你使用情况的技术是低功耗蓝牙。除非你不需要在(蓝牙术语中)非常长的距离上传输数据。 - Jakub Licznerski
显示剩余4条评论

0

正如您所注意到的,两个设备都应该处于发现模式。 我目前正在开发一个WIFI-DIRECT项目,但是它非常不可靠。 在连接和/或断开连接后,您也会发现很难发现。 因此,我所做的是,当用户打开设备WIFI时,我使用一个线程(在无限循环中的后台)每8秒运行一次发现并更新UI。这对我很有效,用户不必持续搜索。

public class DiscoveryUpdater implements Runnable {
@Override
public void run() {
    while(true) {
        mManager.discoverPeers(mChannel, new WifiP2pManager.ActionListener() {

            @Override
            public void onSuccess() {
                Log.d("DiscoveryUpdater", "Successful in adding Discovery Request");
                mManager.requestPeers(mChannel,peerListListener);
            }

            @Override
            public void onFailure(int reasonCode) {
                Log.d("DiscoveryUpdater", "Failed in adding Discovery Request "+reasonCode);
            }
        });
        try {
            Thread.sleep(8000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}

希望能有所帮助(记得更新你的列表,我没有展示那个)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接