在Android 10上使用WifineTworksSpecifier切换accesspoint后发生java.net.ConnectException

在Android 10上使用WifineTworksSpecifier切换accesspoint后发生java.net.ConnectException,android,okhttp,wifimanager,android-10.0,self-signed-certificate,Android,Okhttp,Wifimanager,Android 10.0,Self Signed Certificate,使用WiFineTworksSpecifier配置wifi accespoint后无法建立连接,以下是跟踪 原因:java.net.ConnectException:在120000ms后从/:(端口0)连接到/10.123.45.1(端口443)失败:连接失败:无法访问网络 位于libcore.io.IoBridge.connect(IoBridge.java:143) 位于java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:1

使用WiFineTworksSpecifier配置wifi accespoint后无法建立连接,以下是跟踪

原因:java.net.ConnectException:在120000ms后从/:(端口0)连接到/10.123.45.1(端口443)失败:连接失败:无法访问网络
位于libcore.io.IoBridge.connect(IoBridge.java:143)
位于java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:142)
位于java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:390)
位于java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:230)
位于java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:212)
位于java.net.socksocketimpl.connect(socksocketimpl.java:436)
位于java.net.Socket.connect(Socket.java:621)
在okhttp3.internal.platform.AndroidPlatform.connectSocket(AndroidPlatform.kt:58)上
在okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.kt:268)
... 还有21个
原因:android.system.ErrnoException:连接失败:ENETUNREACH(无法访问网络)
位于libcore.io.Linux.connect(本机方法)
位于libcore.io.ForwardingOs.connect(ForwardingOs.java:95)
在libcore.io.BlockGuardOs.connect上(BlockGuardOs.java:136)
位于libcore.io.ForwardingOs.connect(ForwardingOs.java:95)
在libcore.io.IoBridge.ConnecterNo(IoBridge.java:174)中
位于libcore.io.IoBridge.connect(IoBridge.java:135)
... 29更多

使用wifiManager连接我的物联网设备时。我开始收到针对Android 10的App sdk的连接错误。最初,我开始使用wifinetworksspecifier连接SSID,如下所示

val specifier = WifiNetworkSpecifier.Builder()
            .setSsid(ssid)
            .build()
val request = NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
            .setNetworkSpecifier(specifier)
            .build()

    connManager.requestNetwork(request, object : ConnectivityManager.NetworkCallback() {

    override fun onAvailable(network: Network?) {
         startLocalConnection(network)
    }

    override fun onUnavailable() {
        // do failure processing here..
    }

})
fun startLocalConnection(){
    val trusted = KeyStore.getInstance("BKS")
    val rawResource = context.resources.openRawResource(R.raw.device)
    trusted.load(rawResource, "password")
    val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    trustManagerFactory.init(trusted)
    val trustManager: X509TrustManager = trustManagerFactory.trustManagers
    val sslContext = SSLContext.getInstance("TLS")
    sslContext.init(null, trustManagers, null)
    val socketFactory: SSLSocketFactory = sslContext.socketFactory
    val trustManager: X509TrustManager = trustManagers[0] as X509TrustManager

    var okHttpClient: OkHttpClient = OkHttpClient.Builder()
            .connectionSpecs(listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS))
            .build()

    val request = Request.Builder()
            .url("https://192.168.40.23/device/json")
            .build()

    okHttpClient.newCall(request).enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response) {
            // Success
        }

        override fun onFailure(call: Call, e: IOException) {
            // Causing java.net.ConnectException: Failed to connect to /192.168.40.23
        }
   }}
连接到onAvailable()回调中的SSID后,使用如下自签名证书与本地IOT设备http服务器建立okhttp连接

val specifier = WifiNetworkSpecifier.Builder()
            .setSsid(ssid)
            .build()
val request = NetworkRequest.Builder()
            .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED)
            .addCapability(NetworkCapabilities.NET_CAPABILITY_TRUSTED)
            .setNetworkSpecifier(specifier)
            .build()

    connManager.requestNetwork(request, object : ConnectivityManager.NetworkCallback() {

    override fun onAvailable(network: Network?) {
         startLocalConnection(network)
    }

    override fun onUnavailable() {
        // do failure processing here..
    }

})
fun startLocalConnection(){
    val trusted = KeyStore.getInstance("BKS")
    val rawResource = context.resources.openRawResource(R.raw.device)
    trusted.load(rawResource, "password")
    val trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
    trustManagerFactory.init(trusted)
    val trustManager: X509TrustManager = trustManagerFactory.trustManagers
    val sslContext = SSLContext.getInstance("TLS")
    sslContext.init(null, trustManagers, null)
    val socketFactory: SSLSocketFactory = sslContext.socketFactory
    val trustManager: X509TrustManager = trustManagers[0] as X509TrustManager

    var okHttpClient: OkHttpClient = OkHttpClient.Builder()
            .connectionSpecs(listOf(ConnectionSpec.MODERN_TLS, ConnectionSpec.COMPATIBLE_TLS))
            .build()

    val request = Request.Builder()
            .url("https://192.168.40.23/device/json")
            .build()

    okHttpClient.newCall(request).enqueue(object : Callback {
        override fun onResponse(call: Call, response: Response) {
            // Success
        }

        override fun onFailure(call: Call, e: IOException) {
            // Causing java.net.ConnectException: Failed to connect to /192.168.40.23
        }
   }}

请帮助我跟踪并解决问题。

我现在也遇到了同样的问题

在onAvailable回调中,您必须通过以下方式将网络与设备绑定:

((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE))
                .bindProcessToNetwork(network);

我现在也有同样的问题

在onAvailable回调中,您必须通过以下方式将网络与设备绑定:

((ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE))
                .bindProcessToNetwork(network);

请编辑您的问题并提供完整的堆栈跟踪。@Commonware,日志跟踪为java.net.ConnectException,当在android10中使用okhttpclient进行新的API更改时,这不是一个错误。您可以复制并粘贴到您的问题中。@Commonware,更新了日志跟踪并编辑了我的问题,请帮助我解决此问题。在您的请求中,builder()没有指定url中的任何端口?请编辑您的问题并提供完整的堆栈跟踪。@Commonware,在android10中使用okhttpclient进行新的API更改时,日志跟踪为java.net.ConnectException,而新的API更改不是默认的。您可以将其复制并粘贴到您的问题中。@Commonware,更新了日志跟踪并编辑了我的问题,请帮助我解决此问题。在您的请求中。builder()中,您没有在url中指定任何端口吗?