Bonjour à tous,


Je me bat avec NSD depuis quelques jours et pour le moment, c'est lui qui gagne

L'app
Appui sur un bouton => enregistrement d'un service sur le réseau (l'idée étant que de recevoir des informations d'autres appareil en LAN).
(Je débute en Android pour aider un ami qui lance sa société mais je suis développeur de métier)

Le code
J'ai suivi cette présentation du NSD et j'ai codé ces quelques lignes dans mon activité

Le bouton
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
public void startService(View view){
    initSocket();
    initRegList();
    regService();
}


Les méthodes
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62


public void initSocket(){

    try {
        mSocket = new ServerSocket(0);
    } catch (IOException e) {
        e.printStackTrace();
    }
    mPort = mSocket.getLocalPort();
    Log.e("PORT", " String.valueOf(mPort));
}



// Initialisation écouteur enreg
public void initRegList() {

    mReglist = new NsdManager.RegistrationListener() {
        @Override
public void onRegistrationFailed(NsdServiceInfo nsdServiceInfo, int i) {
            Log.e("FAIL", "REG_FAIL, errcode = " + String.valueOf(i));
        }

        @Override
public void onUnregistrationFailed(NsdServiceInfo nsdServiceInfo, int i) {
            Log.e("FAIL", "UNREG_FAIL, errcode = " + String.valueOf(i));
        }

        @Override
public void onServiceRegistered(NsdServiceInfo nsdServiceInfo) {
            mServName = nsdServiceInfo.getServiceName();
            Log.e("OK", mServName);
        }

        @Override
public void onServiceUnregistered(NsdServiceInfo nsdServiceInfo) {
            Log.e("OK", "UNREG");
        }
    };

}// Reg service
public void regService() {
        
        //Adresse Host               
InetAddress InetAdd = null;
        try {
            InetAdd = InetAddress.getByName("192.168.0.14");// IP du device
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        //Service
        NsdServiceInfo serviceInfo = new NsdServiceInfo();
        serviceInfo.setServiceName("MyCoolService");
        serviceInfo.setServiceType("_myapp.tcp.");
        serviceInfo.setPort(mPort);
        serviceInfo.setHost(InetAdd);
        
        //Lancer le service
        mNsdman = (NsdManager) this.getSystemService(this.NSD_SERVICE);
        mNsdman.registerService(serviceInfo,NsdManager.PROTOCOL_DNS_SD,mReglist);
    }


Au moment d'enregistrer le service (appui bouton donc), je tombe inlassablement dans onRegistrationFailed avec la log suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
09-16 18:17:20.893  15535-15535/fr.lpnsk.lollibox E/PORT﹕ 48930
09-16 18:17:23.803      180-531/? E/MDnsDS﹕ service register request 26 got an error from DNSServiceRegister -65540
09-16 18:17:23.803      538-607/? E/NsdService﹕ Failed to execute registerService com.android.server.NativeDaemonConnector$NativeDaemonArgumentException: command '92 mdnssd register 26 MyCoolService _myapp.tcp. 48930' failed with '501 92 serviceRegister request got an error from DNSServiceRegister'
09-16 18:17:23.804      180-531/? E/MDnsDS﹕ register stop used unknown requestId 26
09-16 18:17:23.804      538-607/? E/NsdService﹕ Failed to execute unregisterService com.android.server.NativeDaemonConnector$NativeDaemonArgumentException: command '93 mdnssd stop-register 26' failed with '501 93 Unknown requestId'
09-16 18:17:23.807  15535-15676/fr.lpnsk.lollibox E/FAIL﹕ REG_FAIL, errcode = 0

Aussi j'aurai deux questions :

Côté code
Voyez-vous un souci ? Je ne trouve rien sur l'Internet ( à part des résultats Apple ?? ) , testé sur Nexus 4 et 7 en 5.1.1 stock, les messages sont les mêmes..

Côté approche
Je veux envoyer des données (disons xml) de N terminaux android vers 1 terminal 'central' android lui aussi.
NSD semble être la best-practice mais je suis peut-être passé à côté de classes qui font ce genre de traitements ?


Merci !