NSD Android — обнаружение сети

Здравствуйте, я новичок в Android-разработке. Я создал класс утилиты NSD. В настоящее время невозможно вызвать метод DiscoveryListner. Любая помощь будет отличной

Основная деятельность

package com.example.android.implicitintents;

import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Toast;

import com.example.android.implicitintents.Utils.NsdUtils;

import java.net.URL;

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "NsdChat";
    public static String URL_WEB;
    NsdUtils mNsdUtils;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        NsdUtils mNsdUtils = new NsdUtils(this);
        mNsdUtils.initializeNsd();
    }

    public void onClickOpenWebpageButton(View view) {
        String urlAsString = "http://192.168.10.1";
        openWebPage(urlAsString);
    }


    private void openWebPage(String url) {
        Intent intent = new Intent(this, ConfigActivity.class);
        intent.putExtra(URL_WEB, url);
        Log.d(TAG, "Button Pressed");

        if (intent.resolveActivity(getPackageManager()) != null) {
            startActivity(intent);
        }
    }
}

Класс полезности НРД

package com.example.android.implicitintents.Utils;

import android.content.Context;
import android.net.nsd.NsdServiceInfo;
import android.net.nsd.NsdManager;
import android.util.Log;

public class NsdUtils {
    Context mContext;

    NsdManager mNsdManager;
    NsdManager.ResolveListener mResolveListener;
    NsdManager.DiscoveryListener mDiscoveryListener;

    public static final String SERVICE_TYPE = "http";

    public static final String TAG = "NsdHelper";
    public String mServiceName = "Plug_Service";

    NsdServiceInfo mService;

    public NsdUtils(Context context) {
        mContext = context;
        mNsdManager = (NsdManager) context.getSystemService(Context.NSD_SERVICE);
    }

    public void initializeNsd() {
        initializeResolveListener();
        initializeDiscoveryListener();
    }

    public void initializeDiscoveryListener() {
        mDiscoveryListener = new NsdManager.DiscoveryListener() {

            @Override
            public void onDiscoveryStarted(String regType) {
                Log.d(TAG, "Service discovery started");
            }

            @Override
            public void onServiceFound(NsdServiceInfo service) {
                Log.d(TAG, "Service discovery success" + service);
                if (!service.getServiceType().equals(SERVICE_TYPE)) {
                    Log.d(TAG, "Unknown Service Type: " + service.getServiceType());
                } else if (service.getServiceName().equals(mServiceName)) {
                    Log.d(TAG, "Same machine: " + mServiceName);
                } else if (service.getServiceName().contains(mServiceName)){
                    mNsdManager.resolveService(service, mResolveListener);
                }
            }

            @Override
            public void onServiceLost(NsdServiceInfo service) {
                Log.e(TAG, "service lost" + service);
                if (mService == service) {
                    mService = null;
                }
            }

            @Override
            public void onDiscoveryStopped(String serviceType) {
                Log.i(TAG, "Discovery stopped: " + serviceType);
            }

            @Override
            public void onStartDiscoveryFailed(String serviceType, int errorCode) {
                Log.e(TAG, "Discovery failed: Error code:" + errorCode);
                mNsdManager.stopServiceDiscovery(this);
            }

            @Override
            public void onStopDiscoveryFailed(String serviceType, int errorCode) {
                Log.e(TAG, "Discovery failed: Error code:" + errorCode);
                mNsdManager.stopServiceDiscovery(this);
            }
        };
    }

    public void initializeResolveListener() {
        mResolveListener = new NsdManager.ResolveListener() {

            @Override
            public void onResolveFailed(NsdServiceInfo serviceInfo, int errorCode) {
                Log.e(TAG, "Resolve failed" + errorCode);
            }

            @Override
            public void onServiceResolved(NsdServiceInfo serviceInfo) {
                Log.e(TAG, "Resolve Succeeded. " + serviceInfo);

                if (serviceInfo.getServiceName().equals(mServiceName)) {
                    Log.d(TAG, "Same IP.");
                    return;
                }
                mService = serviceInfo;
            }
        };
    }
    public void discoverServices() {
        mNsdManager.discoverServices(
                SERVICE_TYPE, NsdManager.PROTOCOL_DNS_SD, mDiscoveryListener);
    }
}

Я попытался вызвать dicoverService в событии кнопки onclick, но не удалось. Нам нужно создать асинхронную задачу или новый поток?


person Aarth Tandel    schedule 18.07.2017    source источник


Ответы (2)


Нет необходимости запускать эту функцию в другом потоке. После некоторого исследования текущая функциональность прекращает сбой и начинает обнаружение при изменении String SERVICE_TYPE = "http"; на public static final String SERVICE_TYPE = "_name._tcp";

Вы можете обнаружить службу tcp, а затем, когда вы получите IP, просто подключитесь к веб-серверу через http, используя этот IP-адрес.

person Volodymyr Bereziuk    schedule 19.07.2017

сначала укажите тип сети TCP, которую вы хотите найти. Затем сделайте объект класса и вызовите Intilization, а затем функцию обнаружения NSD.

Он должен работать нормально.

person Community    schedule 30.10.2017