Android WiFi Aware - 创建多个连接时出错

问题描述 投票:0回答:1

与那里提出的问题类似,我目前正在开发一个Android应用程序,它利用Wi-Fi Aware API来建立设备到设备的连接。发现过程完成(通过发布/订阅机制)并且设备了解其对等设备后,我可以打开设备到设备连接来交换数据。

但是,这种预期行为仅在我在具有一对设备(设备 A 和 B)的场景中进行测试时才会发生,其中 A 充当发布者,B 充当订阅者(例如)。如果我使用第三台设备(设备 C)作为订阅者进行测试,我将无法打开设备 A 和 C 之间的连接。

在发布者(设备 A)上,我收到以下两条错误消息:

2024-01-24 14:45:20.054  1656-2060  WifiAwareDataPathStMgr  system_server E selectInterfaceForRequest: req=AwareNetworkRequestInformation: state=103, ns=WifiAwareNetworkSpecifier [type=0, role=1, clientId=254, sessionId=255, peerId=413, peerMac=<null>, securityConfig=WifiAwareDataPathSecurityConfig [cipherSuite=1, passphrase=<non-null>, PMK=<null>, PMKID=<null>], port=43619, transportProtocol=-1, channel=0, forceChannel=false], uid=10248, packageName=com.example.mscwfa1, interfaceName=null, pubSubId=1, specifiedPeerInstanceId=1, specifiedPeerDiscoveryMac=42F0F09263F4, equivalentSpecifiers=[NetworkRequest [ REQUEST id=3075, [ Transports: WIFI_AWARE Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN Specifier: <WifiAwareNetworkSpecifier [type=0, role=1, clientId=254, sessionId=255, peerId=413, peerMac=<null>, securityConfig=WifiAwareDataPathSecurityConfig [cipherSuite=1, passphrase=<non-null>, PMK=<null>, PMKID=<null>], port=43619, transportProtocol=-1, channel=0, forceChannel=false]> Uid: 10248 RequestorUid: 10248 RequestorPkg: com.example.mscwfa1 UnderlyingNetworks: Null] ], ], NdpInfos[] - no interfaces available!

2024-01-24 14:45:20.063  1656-2060  WifiAwareDataPathStMgr  system_server E  WifiAwareNetworkFactory.releaseNetworkFor: networkRequest=NetworkRequest [ REQUEST id=3075, [ Transports: WIFI_AWARE Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN Specifier: <WifiAwareNetworkSpecifier [type=0, role=1, clientId=254, sessionId=255, peerId=413, peerMac=<null>, securityConfig=WifiAwareDataPathSecurityConfig [cipherSuite=1, passphrase=<non-null>, PMK=<null>, PMKID=<null>], port=43619, transportProtocol=-1, channel=0, forceChannel=false]> Uid: 10248 RequestorUid: 10248 RequestorPkg: com.example.mscwfa1 UnderlyingNetworks: Null] ] not in cache!? 

在第二个订阅者(设备 C)上,我收到 NetworkCallback.onUnavailable 和此错误消息:

2024-01-24 14:45:20.440  1746-2653  WifiAwareDataPathStMgr  system_server E  WifiAwareNetworkFactory.releaseNetworkFor: networkRequest=NetworkRequest [ REQUEST id=3546, [ Transports: WIFI_AWARE Capabilities: NOT_RESTRICTED&TRUSTED&NOT_VPN Specifier: <WifiAwareNetworkSpecifier [type=0, role=0, clientId=253, sessionId=255, peerId=388, peerMac=<null>, securityConfig=WifiAwareDataPathSecurityConfig [cipherSuite=1, passphrase=<non-null>, PMK=<null>, PMKID=<null>], port=0, transportProtocol=-1, channel=0, forceChannel=false]> Uid: 10248 RequestorUid: 10248 RequestorPkg: com.example.mscwfa1 UnderlyingNetworks: Null] ] not in cache!? 

在 Android API 级别 31+ 中,ConnectivityManager 对于我可以拥有的并发网络数量是否有任何限制?如果没有,为什么我会收到“无可用接口”错误,并因此在我请求的网络上回调 onUnavailable?

java android kotlin wifimanager
1个回答
0
投票

接口错误是硬件限制,您可以这样检查每个设备的限制

wifiAwareManager = (WifiAwareManager) context.getSystemService(Context.WIFI_AWARE_SERVICE);

    // Check if Wi-Fi Aware is supported on this device
    if (wifiAwareManager.isAvailable()) {

        Characteristics characteristics = wifiAwareManager.getCharacteristics();

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {

            assert characteristics != null;
            Log.d(TAG,String.format(
                    "isAwarePairingSupported() - %b \n" +
                            "isInstantCommunicationModeSupported() - %b \n" +
                            "isSetChannelOnDataPathSupported() - %b \n" +
                            "getNumberOfSupportedDataInterfaces - %d \n" +
                            "getNumberOfSupportedDataPaths - %d \n",
                    characteristics.isAwarePairingSupported(),
                    characteristics.isInstantCommunicationModeSupported(),
                    wifiAwareManager.isSetChannelOnDataPathSupported(),
                    characteristics.getNumberOfSupportedDataInterfaces(),
                    characteristics.getNumberOfSupportedDataPaths()
            ));
        }
        Log.d(TAG, String.format("getAvailableDataPathsCount() = %d \n" +
                        "getAvailableSubscribeSessionsCount() = %d \n" +
                        "getAvailablePublishSessionsCount() = %d\n",
                wifiAwareManager.getAvailableAwareResources().getAvailableDataPathsCount(),
                wifiAwareManager.getAvailableAwareResources().getAvailableSubscribeSessionsCount(),
                wifiAwareManager.getAvailableAwareResources().getAvailablePublishSessionsCount()));
    } else {
        wifiAwareManagerStatus = false;
        Log.d("wifiAwareManager", "not available");
        // Wi-Fi Aware is not available on this device
    }

支持的数据路径和支持的数据接口是不同的东西,您可以让一个设备充当 X 数量订阅者的发布者,其中 X 是支持的数据接口,仅具有 1 个接口

© www.soinside.com 2019 - 2024. All rights reserved.