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

Développement Mobile en Java Discussion :

Modem GSM en java


Sujet :

Développement Mobile en Java

  1. #1
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut Modem GSM en java
    Comment je peut indiquer le type et le port d'un modem GSM wavecom en java? je sais qu'avec VB, il y a un objet MSComm. Y-a-t'il un équivalent en java?
    Merci d'avance

  2. #2
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    j'ai arrivé à initialisé mon modem GSM voilà mon code:
    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
    //initialisation du driver
    		Win32Driver w32Driver= new Win32Driver();
    		w32Driver.initialize();
            //r?cup?ration de l'?num?ration
    		Enumeration portList=CommPortIdentifier.getPortIdentifiers();
            //affichage des noms des ports
    		CommPortIdentifier portId=null;
    		while (portList.hasMoreElements()){
    			portId=(CommPortIdentifier)portList.nextElement();
    			System.out.println(portId.getName());
    		}
    		try{
    			portId=CommPortIdentifier.getPortIdentifier("COM1");
    		}catch(NoSuchPortException ex){
    			System.out.println("NoSuchPortException");
    		}
    		SerialPort port=null;
    		try {
    			port=(SerialPort)portId.open("Frame1", 10000); // L'appel de la m?thode open accepte deux param?tres : * le nom de l'application qui demande le port * le d?lai d'attente pour l'obtention du port en millisecondes.Si le port est d?j? utilis? par une autre application, le syst?me propage un PORT_OWNERSHIP_REQUESTED et donne alors le d?lai au syst?me pour lib?rer le port. En cas d'?chec une PortInUseException est lev?e. 
    		} catch (PortInUseException ex) {
    			System.out.println("PortInUseException");
    		}
    		/* Apr?s son ouverture, vous devez param?trer le port. Les param?tres importants pour la communication par port s?rie sont :
     
    	    * le contr?le de flux
    	    * le d?bit de la connexion (en Bauds)
    	    * le nombre de bits de donn?es
    	    * le ou les bits stop
    	    * la pr?sence d'un bit de parit?
     
    	    */
    //		ajout du listener
    		try {
    			port.addEventListener(this);
    		} catch (TooManyListenersException e) {
    		}
    		port.notifyOnDataAvailable(true);
     
    		try{
    			port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);
    			port.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
    		}catch (UnsupportedCommOperationException ex){
    			System.out.println("UnsupportedCommOperationException");
    		}
    et j'ai importé ces packages:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    import javax.comm.*;
     
    import com.sun.comm.Win32Driver;
    import java.io.*;
    mais je ne sais pas comment envoyer un flux précis sur le port je sais seulement lire les flux entrants et sortants sur le port
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    private OutputStream outStream; //flux d'écriture du port
    //récupération du flux de lecture et écriture du port
    		try {
    			outStream = sPort.getOutputStream();
    			bufRead =
    				new BufferedReader(
    					new InputStreamReader(sPort.getInputStream()));
    		} catch (IOException e) {
    Est ce que quelqu'un peut m'aider?Merci

  3. #3
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Bonsoir,


    Tu dois déclarer un PrintWriter comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private PrintWriter sortie;
    sortie = new PrintWriter(bufRead.getOutputStream(), true);
    Ensuite tu as juste à faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sortie.println("Je te send des données");
    Bon courage,

  4. #4
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    salut

    j'ai à peu prêt le même problème: la communication entre mon modem et mon application.

    Du coup j'essaye la solution de X-plode.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    private PrintWriter sortie;
    sortie = new PrintWriter(bufRead.getOutputStream(), true);
    sauf que la méthode getOutputStream n'est pas défini pour un objet BufferedReader...

    Sinon quand j'essaye d'envoyer des commandes à mon modem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String messageString = "AT+CSQ";
    System.out.println("Envoi de "+messageString);
    outputStream.write(messageString .getBytes());
    le modem devrait me répondre, en utilisant le bufRead

    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
    public void serialEvent(SerialPortEvent event) {
            switch(event.getEventType()) {
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:
            	System.out.println("Reception...");
            	int messageLu = 0;
    				try {
    					while (inputStream.available() > 0) {
    					//messageLu = bufRead.readLine().trim();
    					messageLu = bufRead.read();
    					System.out.println((char)messageLu);
    					}
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
                break;
            }
        }
    je lis ce que j'envoie et non ce que mon modem devrait me renvoyer...
    Je fais surement quelque chose de mal au niveau des flux mais j'ai du mal à comprendre comment marche le transfert de données !

    j'ai tenté de suivre le tuto http://christophej.developpez.com/tu...java/javacomm/ sans réussir à communiquer avec mon modem.
    Modem qui marche bien d'ailleurs, puisqu'avec Hyperterminal je n'ai aucun soucis. Mon but étant d'envoyer des sms avec.

    Merci !

    EDIT:
    après réflexion, j'ai changé bufRead.getOutputStream() par mon objet outputStream et cette fois ci ça marche. Je récupère à peu prêt la réponse de mon modem. C'est pas encore ça mais c'est déjà un pas de fait

  5. #5
    Membre Expert
    Avatar de X-plode
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2005
    Messages
    682
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2005
    Messages : 682
    Par défaut
    Désolé c'étais pour un socket.

    Pour l'API, est-ce que tu fais ainsi ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SerialPort port;
    try {
    	port=(SerialPort)portId.open("Mon_Appli", 10000);
    } catch (PortInUseException ex) {
    	//traitement de l'exception
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    InputStream in;
    OutputStream out; 
    try {
    	out = port.getOutputStream();
    	in = port.getInputStream();
    } catch (IOException ex) {
    	//gestion de l'exception
    }

  6. #6
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    oui j'ai fait comme ça, mais apparemment ça vient de ma façon d'envoyer mes messages au modem.
    J'ai édité mon post du dessus.
    Ta méthode semble fonctionner. Je tiendrais mon post à jour quand je réussirai à faire ce que je veux, ou si j'ai un prob !
    Merci !

  7. #7
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Citation Envoyé par xiror Voir le message
    après réflexion, j'ai changé bufRead.getOutputStream() par mon objet outputStream et cette fois ci ça marche. Je récupère à peu prêt la réponse de mon modem. C'est pas encore ça mais c'est déjà un pas de fait
    Où vous avez changé ça? Est ce que vous avez changer ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private PrintWriter sortie;
    sortie = new PrintWriter(bufRead.getOutputStream(), true);
    par celui ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    private PrintWriter sortie;
    sortie = new PrintWriter(outputStream.write(messageString .getBytes()), true);
    ? Svp si vous trouvez correctement comment envoyer les commandes AT au modem aidez moi car je me bloque.Merci d'avance

  8. #8
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    tout simplement comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sortie = new PrintWriter(outputStream, true);
    puis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    String messageString = "AT";
    		System.out.println("Envoi de "+messageString);
    		sortie.println(messageString);
    je mettrais le code complet quand ça marchera bien
    mais en mettant ce code j'arrive à avoir la réponse "OK" du modem, ça veut dire que ma commande passe correctement !

  9. #9
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Comment tu peux etre sur que le modem a répondu "OK". Avec ça?
    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
    private OutputStream outStream; 
    private BufferedReader fluxLecture;
    private String flux;
    try {
    			outStream = port.getOutputStream();
    			fluxLecture =
    				new BufferedReader(
    					new InputStreamReader(port.getInputStream()));
    		} catch (IOException e) {
    			System.out.println("IOException");
    		}
    public void serialEvent(SerialPortEvent event) {
    		//gestion des ?v?nements sur le port :
    		//on ne fait rien sauf quand les donn?es sont disponibles
    		switch (event.getEventType()) {
    			case SerialPortEvent.BI :
    			case SerialPortEvent.OE :
    			case SerialPortEvent.FE :
    			case SerialPortEvent.PE :
    			case SerialPortEvent.CD :
    			case SerialPortEvent.CTS :
    			case SerialPortEvent.DSR :
    			case SerialPortEvent.RI :
    			case SerialPortEvent.OUTPUT_BUFFER_EMPTY :
    				break;
    			case SerialPortEvent.DATA_AVAILABLE :
    				flux = new String(); 
    				try {
    					//lecture du buffer et affichage
    					flux= (String) fluxLecture.readLine();
    					System.out.println("Flux= "+flux);
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
    				break;
    		}
    	}
    if(flux.compareTo("OK")==0) // V?rifier que le modem a r?pondu OK
    								{	
    									System.out.println("OK");
    													}

  10. #10
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    voilà mon code marche et j'envoie des sms avec JAVA
    (+ mon wavecom fastrack m1306b)

    je sais ce que le modem répond car je l'écris dans la console, après une comparaison de chaine ça doit bien marcher oui.

    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    import java.io.*;
    import java.util.*;
    import javax.comm.*;
     
    public class ModemDialog implements Runnable, SerialPortEventListener {
        static CommPortIdentifier portId;
        static Enumeration portList;
     
        InputStream inputStream;
        OutputStream outputStream;
        SerialPort serialPort;
        Thread readThread;
     
        PrintWriter sortie;
        BufferedReader bufRead;
        BufferedReader entree;
     
        public static void main(String[] args) {
            try {
    			portId = CommPortIdentifier.getPortIdentifier("COM3");
    			ModemDialog instance = new ModemDialog();
    		} catch (NoSuchPortException e) {
    			e.printStackTrace();
    		}
        }
     
        public ModemDialog() {
        	System.out.println("Connexion sur le port COM");
            try {
                serialPort = (SerialPort) portId.open("ModemDialog", 2000);
            } catch (PortInUseException e) {}
            try {
            	outputStream = serialPort.getOutputStream();
                inputStream = serialPort.getInputStream();
                bufRead = new BufferedReader(new InputStreamReader(inputStream));
                sortie = new PrintWriter(outputStream, true);
            } catch (IOException e) {}
    	try {
                serialPort.addEventListener(this);
    	} catch (TooManyListenersException e) {}
            serialPort.notifyOnDataAvailable(true);
            try {
                serialPort.setSerialPortParams(9600,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);
            } catch (UnsupportedCommOperationException e) {}
            readThread = new Thread(this);
            readThread.start();
            String messageString = "AT";
            entree = new BufferedReader(new InputStreamReader(System.in));
            while(!messageString.equals("stop"))
            {
            	System.out.println("Entrer une commande AT...");
            	try {
            		messageString = entree.readLine();
            	} catch( IOException e ) {
            	        e.printStackTrace();
            	}
            	if(messageString.equals("CtrlZ"))
            	{
            		//System.out.println("on détecte le car 26"+(char)26);
            		sortie.println((char)26);
            	}
            	else
            	{
            		System.out.println("Envoi de "+messageString);
            	sortie.println(messageString);
            	}
            }
        }
     
        public void run() {
            try {
                Thread.sleep(20000);
            } catch (InterruptedException e) {}
        }
     
        public void serialEvent(SerialPortEvent event) {
        	//System.out.println("Event de récéption");
            switch(event.getEventType()) {
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:
            	//System.out.println("Reception...");
     
            	int messageLu = 0;
            	//String messageLuStr = null;
    				try {
    					while (inputStream.available() > 0) {
    					//messageLuStr = bufRead.readLine().trim();
    					//System.out.println(messageLuStr);
    					messageLu = bufRead.read();
    					System.out.print((char)messageLu);
    					}
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
                break;
            }
        }
    }
    Pour envoyer un SMS j'envoie en ligne de commande:
    AT+CMGS="+33660000000"
    (j'ai mis plein de 0 mais sinon mettez un vrai numéro de téléphone, le +33 c'est pour indiquer la france même si vu que le modem est sur le réseau Français il n'y en a surement pas besoin.)
    Le modem me renvoi:
    >
    J'écris mon sms directement dans la console; puis après avoir envoyé (touche entrer), je transmet le signal d'envoi du sms:
    CtrlZ
    J'ai mis CtrlZ, mais ça peut être autre chose, derrière il faut juste transmettre le Ctrl Z qui correspond au caractère 26.

    voilà j'espère que ça va aider !

  11. #11
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Vraiment merci beaucoup pour votre aide mais le problème que j'ai maintenant c'est que lorsque j'envoi au début la commande "AT" je veux recevoir le "OK" dans une variable et non sur le console. Est ce que vous avez une idée comment le faire? Merci

  12. #12
    Membre du Club
    Inscrit en
    Avril 2009
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 8
    Par défaut
    j'ai pas trop le temps de voir, mais l'idée serait de mettre les caractères que l'on lit dans un String au fur et à mesure de la lecture. Le string serait une variable de classe à réinitialiser à vide (maChaine = ""; ) entre chaque commande de l'utilisateur.
    Après faut gérer le moment où la chaine est "prête" à être utilisée.
    Mais là c'est le week-end pour moi ^^
    Donc je suis en mode "ne peut plus réfléchir" désolé

    J'espère que tu vas résoudre le problème, n'hésite pas à poster ici l'avancement.

  13. #13
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Ok merci mais je pose ce genre de question parce que pour le moment j'ai pas de modem GSM pour tester c'est pour cela.

  14. #14
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Pour avoir l'accusé de réception je sais qu'il faut utiliser la commande AT "CDS". Comment l'intégrer dans le code? Merci

  15. #15
    Membre confirmé
    Inscrit en
    Janvier 2009
    Messages
    121
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 121
    Par défaut
    Pourquoi vous utilisez un thread? quand vous le lancez qu'est ce qu'il exécute exactement?
    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
    public void serialEvent(SerialPortEvent event) {
        	//System.out.println("Event de récéption");
            switch(event.getEventType()) {
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:
            	//System.out.println("Reception...");
     
            	int messageLu = 0;
            	//String messageLuStr = null;
    				try {
    					while (inputStream.available() > 0) {
    					//messageLuStr = bufRead.readLine().trim();
    					//System.out.println(messageLuStr);
    					messageLu = bufRead.read();
    					System.out.print((char)messageLu);
    					}
    				} catch (IOException e) {
    					e.printStackTrace();
    				}
                break;
            }
        }
    ce qui est mis comme étant commentaire est ce que vous l'avez essayé et ne marche pas c'est pour ça que vous l'avez enlever? Est ce que je peux remplacer la boucle while par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    messageLuStr = bufRead.readLine()
    ?
    Merci d'avance

Discussions similaires

  1. [JAVA] Modem GSM par USB
    Par touronster dans le forum Développement
    Réponses: 0
    Dernier message: 19/08/2009, 01h41
  2. connexion au modem gsm
    Par Haryou dans le forum Exchange Server
    Réponses: 1
    Dernier message: 16/10/2007, 23h23
  3. Développer sur Modem GSM
    Par moutey dans le forum Développement Mobile en Java
    Réponses: 4
    Dernier message: 01/03/2007, 18h56
  4. [C# et GSM] trouver des contrôles pour cartes sim et modems gsm
    Par Abydos Business Group dans le forum Windows Forms
    Réponses: 1
    Dernier message: 25/07/2006, 00h47
  5. Modem GSM (Gateway)
    Par mejri dans le forum Hardware
    Réponses: 7
    Dernier message: 27/06/2006, 15h10

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