IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Android Discussion :

[Tutoriel] Android et le broadcast UDP appliqué à la détection d'un serveur en réseau Wi-Fi local


Sujet :

API standards et tierces Android

  1. #1
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Points : 1 499
    Points
    1 499
    Par défaut [Tutoriel] Android et le broadcast UDP appliqué à la détection d'un serveur en réseau Wi-Fi local
    Bonjour,

    Pour alimenter la page des cours et tutoriels pour apprendre la programmation Android, voici un nouveau tutoriel expliquant comment se servir du broadcast UDP sous Android pour trouver automatiquement l'adresse IP d'un serveur sur le même réseau Wi-Fi local.

    Merci de poster vos remarques ou question à la suite.

  2. #2
    Membre expert
    Avatar de MathiasSeguy
    Homme Profil pro
    Fondateur Android2EE - Formation Expertise Android
    Inscrit en
    Avril 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fondateur Android2EE - Formation Expertise Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 185
    Points : 3 692
    Points
    3 692
    Billets dans le blog
    6
    Par défaut
    Bonjour,
    Super article, j'en ai les yeux qui brillent tellement c'est beau.
    Juste une question toute bête, le code serveur je le déploie où et sur quoi ? Je fais un war et c'est fini?

  3. #3
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Points : 1 499
    Points
    1 499
    Par défaut
    Bonjour,

    Ravi que tu ai apprécié.
    Pour le code serveur, celui que je donne est un code serveur pour application Android, pour le cas ou l'on fait une application voulant dialoguer avec une autre instance d'elle même sous la forme d'un échange client serveur.
    Après pour un serveur "classique", le principe est le même, bien que l'API puisse changer. Il suffit de créer une socket serveur en UDP.

    Bonne continuation.

  4. #4
    Membre expert
    Avatar de MathiasSeguy
    Homme Profil pro
    Fondateur Android2EE - Formation Expertise Android
    Inscrit en
    Avril 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fondateur Android2EE - Formation Expertise Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 185
    Points : 3 692
    Points
    3 692
    Billets dans le blog
    6
    Par défaut
    Fichtre dis donc, j'avais pas compris.
    Ca veut dire que le code serveur je le colle dans mon application Android dans sa partie serveur et ça marche tout seul?
    J'ai pas besoin de demander des permissions, ni de mettre ce code dans un service, comment ton code est appelé ? Ton application "serveur" tourne en permanence? Aurais-tu un cas d'utilisation?

  5. #5
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Points : 1 499
    Points
    1 499
    Par défaut
    Imagines 2 boutons dans une Activity, un nommé "Serveur" et l'autre "Client".
    Si tu cliques sur serveur, il crée un objet Discovery (le nom de ma classe), et appelles "waitingForDiscover()".
    Le bouton "client" lui crée une instance de Discovery et ensuite appelles getServerIp(). Si le retour de la fonction est null, alors aucun serveur n'a été trouvé, sinon elle renvoie l'IP du serveur, et ce dernier a arrêté son serveur UDP entre temps.

  6. #6
    Membre expert
    Avatar de MathiasSeguy
    Homme Profil pro
    Fondateur Android2EE - Formation Expertise Android
    Inscrit en
    Avril 2011
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Fondateur Android2EE - Formation Expertise Android
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 185
    Points : 3 692
    Points
    3 692
    Billets dans le blog
    6
    Par défaut
    Et ensuite je parle entre eux en utilisant le protocole TCP ou UDP comme je veux.
    Magique.
    Je pense que tu pourrais rajouter ton dernier post dans un paragraphe exemple d'utilisation dans ton article, cela éclairerait pas mal de monde.
    En tout cas super.
    merci pour ton article

  7. #7
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Points : 1 499
    Points
    1 499
    Par défaut
    Citation Envoyé par MathiasSeguy Voir le message
    Et ensuite je parle entre eux en utilisant le protocole TCP ou UDP comme je veux.
    merci pour ton article
    Oui c'est tout à fait ça.

    Et tu as raison je vais rajouter dans le tuto le mode d'utilisation.

  8. #8
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Bonjour,

    Etant en stage, je dois créer une application sur smartphone permettant d'envoyer des jpeg à un mobile embarqué.
    Ma contrainte est que la communication doit se faire via le wifi en udp par un réseau, je suis donc tombé sur ton code (qui est très bien), néanmoins qu'en je l'utilise tel quel, mon application plante juste avant le "socket.send(packet);".
    Via le module ddms, j'ai récupéré quelque infos entre autres :
    07-12 14:54:10.360: INFO/System.out(5757): paddr 192.168.10.97 gateway 192.168.10.200 netmask 255.255.255.0 dns1 192.168.10.200 dns2 0.0.0.0 DHCP server 192.168.10.200 lease 7200 seconds
    J'obtiens comme erreur :
    07-12 14:54:10.360: DEBUG/ERROR(5757): Verify your Wifi connection
    Ce qui implique que mon réseau n'est pas joignable.

    Et après plusieurs débogage, je ne vois pas ce qui pourrait merder.
    Je développe sous un Xpéria version 2.1-update (API 7) sans carte sim, je peux me connecter manuellement avec le wifi au réseau local de l'entreprise.
    Je précise aussi que je suis débutant sous android...

    Merci pour votre aide,
    Cordialement

  9. #9
    Rédacteur
    Avatar de Viish
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2009
    Messages
    427
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 427
    Points : 1 499
    Points
    1 499
    Par défaut
    Vérifie qu'au moment d’exécuter ton appli tu sois bien connecté au WiFi, et si c'est pas ça que dans ton fichier Manifest.xml tu demandes bien la permission Internet.

  10. #10
    Membre du Club
    Profil pro
    Étudiant
    Inscrit en
    Février 2005
    Messages
    64
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2005
    Messages : 64
    Points : 46
    Points
    46
    Par défaut
    Pour ce qui est du manifest internet est bien présent mais effectivement je pensais qu'il suffisait d'activer le wifi et non d'y être connecté (je ne sais pas pourquoi j'ai compris ça).

    Merci en tout, j'ai encore des erreurs mais je regarderai ça demain ^^.

  11. #11
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Hello !

    Je voulais utiliser (ou au moins tester) cette classe pour un projet que j'ai pour les cours, mais je n'arrive pas à savoir à quelle classe fait référence cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    String myAdress = Engine.getIpAddress();
    Ou se trouve la classe Engine ? Eclipse me propose deux import, mais il ne me semble pas correspondre à ce que je cherche (un pour les Wallpaper et l'autre pour le TextToSpeech ...).

  12. #12
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4
    Points : 6
    Points
    6
    Par défaut
    Finalement j'ai définit ma propre méthode getIpAddress() grâce à ce lien. Il faut juste penser à ajouter la permission android.permission.INTERNET à votre manifeste.

  13. #13
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    Cool cet article, exactement ce que je cherchais.

    Il arrive en 4eme position d'une recherche google "android udp broadcast".

    Dans mon cas, le but est d'établir une connexion TCP (sur un port inconnu par le client) avec un serveur sous Windows (l'adresse de ce serveur est aussi inconnue à l'avance) qui se trouve dans le réseau local, le broadcast UDP ne supporte pas (ou assez mal) le franchissement de routeurs.

    Donc une trame UDP broadcast et le serveur me retourne le numéro de port TCP (et son adresse par la même occasion) et ensuite, c'est à moi de jouer...

    Merci

  14. #14
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Points : 50 369
    Points
    50 369
    Par défaut
    J'ajoute quelques limitations dues à l’émulateur ;

    • D'abord, il n'y a pas de WiFi sur l’émulateur
    • Ensuite l'adresse IP de l’émulateur est TOUJOURS 10.0.2.15
    • ensuite l'émulateur se trouve derrière un firewall virtuel qui fait de la NAT avec l'adresse IP de votre machine pour utiliser son adresse IP locale lorsqu'il part vers le réseau local


    Donc, pour que le code présenté fonctionne aussi bien dans un vrai device que dans l’émulateur, il faut ruser un peu :

    1/ Bien encadrer toutes les fonctions WiFi... et Dhcp... avec "if IsUseEmuletor()" afin de ne pas les utiliser dans l'émulateur (sinon, pointeur NULL ou exception)

    2/ L'adresse IP de broadcast de la machine hôte ne peut pas être devinée, il faut donc la fixer en dure avec un code du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(IsUseEmulator())
       broadcast = "192.168.1.255";
    else
       broadcast = GetBroadcastAddress();
    La fonction IsUseEmulator() pouvant être celle là par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    boolean IsUseEmulator() { return "generic".equals(Build.BRAND); }

  15. #15
    Candidat au Club
    Homme Profil pro
    android
    Inscrit en
    Mars 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Tunisie

    Informations professionnelles :
    Activité : android
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2014
    Messages : 1
    Points : 2
    Points
    2
    Par défaut
    @ en faite j'ai la meme faute mais j'arrive pas a la corriger "String myAdress = Engine.getipAddress();" j'ai deja mis
    <uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
    dans le fichier Manifest mais cette erreu est encore pouvez vous m'aider

  16. #16
    Nouveau Candidat au Club
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2013
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Projet avec 100 clients
    Bonjour,
    Je réalise un projet ou 100 smartphones,tablettes doivent communiquer en tcp avec un pc portable, via le réseau wifi.
    Je me suis inspiré de votre code pour la détéction automatique et c'est fonctionnel.
    Le problème, c'est que le premier client trouve le seveur au bout de 3 secondes, le suivant au bout de 6-7, le suivant 7-9, le suivant 9-15,etc...
    Je pense que c'est du au fait que mes client :
    envoi la trame broadcast
    ecoute la reponse
    si serveur, j'arrete
    sinon j'ecoute encore

    Et comme chacun envoit de requetes en broadcast, je peux imaginer que le dernier 100eme client peut mettre plus de 10 minutes à trouver le serveur, ce qui est , intolérable.
    Je me suis dis que je vais envoyer au serveur sur le port A
    Du coté serveur J'ecoute le port A
    Puis je réonds à un port B à l'adresse IP client
    et de du coté client apres envoit j'attends une confirmation sur le port B,


    mais meme là celà ne fonctionne pas assez vite...

    Une idée pour creer une communication optimisé entre Adroid(java) et le VB.net ?

    Merci d'avoir pris le temps de lire

Discussions similaires

  1. Les futurs tutoriels Android sur DVP ?
    Par Feanorin dans le forum Android
    Réponses: 63
    Dernier message: 18/01/2015, 14h12
  2. [RESOLUT]Broadcast UDP sur le réseau
    Par Vermouth dans le forum Linux
    Réponses: 2
    Dernier message: 02/07/2010, 21h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo