WiFi 局域网通信 - 发现服务和解析

72 阅读1分钟

1. nsdManager

nsdManager = requireContext().getSystemService(Context.NSD_SERVICE) as NsdManager

2. NsdManager.DiscoveryListener

注意:在onStartDiscoveryFailed 和 onStopDiscoveryFailed里不要调用nsdManager.stopServiceDiscovery(this) 方法,会出现crash问题;如下方式调用:

if (discoveryListener != null) {
    Log.d(TAG, "start : loadData ")
    nsdManager.stopServiceDiscovery(discoveryListener)
}

discoveryListener = object : NsdManager.DiscoveryListener {
    override fun onDiscoveryStarted(regType: String) {
        Log.d(TAG, "Service discovery started")
    }

    override fun onServiceFound(service: NsdServiceInfo) {
        Log.d(TAG, "Service discovery success: $service")
        Log.d(TAG, "Service discovery serviceName: ${service.serviceName}")
        when {
            service.serviceType != SERVICE_TYPE ->
                Log.d(TAG, "Unknown Service Type: ${service.serviceType}")
            service.serviceType == SERVICE_TYPE -> {
                Log.d(TAG, "start : resolveListener ")
                resolveService(service)
            }
        }
    }

    override fun onServiceLost(service: NsdServiceInfo) {
        // When the network service is no longer available.
        Log.e(TAG, "service lost: $service")
    }

    override fun onDiscoveryStopped(serviceType: String) {
        Log.i(TAG, "Discovery stopped: $serviceType")
    }

    override fun onStartDiscoveryFailed(serviceType: String, errorCode: Int) {
        Log.e(TAG, "onStart Discovery failed: Error code:$errorCode")
    }

    override fun onStopDiscoveryFailed(serviceType: String, errorCode: Int) {
        Log.e(TAG, "onStop Discovery failed: Error code:$errorCode")
    }
}

//SERVICE_TYPE 为你自定义的服务名称,比如 const val SERVICE_TYPE = "_test-rct._tcp."
nsdManager.discoverServices(SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, discoveryListener)

3. NsdManager.ResolveListener

private fun resolveService(service: NsdServiceInfo) {
    val resolveListener = object : NsdManager.ResolveListener {
        override fun onResolveFailed(serviceInfo: NsdServiceInfo, errorCode: Int) {
            Log.e(TAG, "Resolve failed: $errorCode")
        }

        override fun onServiceResolved(serviceInfo: NsdServiceInfo) {
            val port: Int = serviceInfo.port
            val host =serviceInfo.host.hostAddress
            Log.d(TAG, "Resolve port: $port")
            Log.d(TAG, "Resolve host: $host")
        }
    }
    nsdManager.resolveService(service, resolveListener)
}