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
Version imprimable
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
j'ai arrivé à initialisé mon modem GSM voilà mon code:
et j'ai importé ces packages:Code:
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"); }
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 portCode:
1
2
3
4 import javax.comm.*; import com.sun.comm.Win32Driver; import java.io.*;
Est ce que quelqu'un peut m'aider?MerciCode:
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) {
Bonsoir,
Tu dois déclarer un PrintWriter comme suit :
Ensuite tu as juste à faire :Code:
1
2
3 private PrintWriter sortie; sortie = new PrintWriter(bufRead.getOutputStream(), true);
Bon courage,Code:
1
2 sortie.println("Je te send des données");
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.
sauf que la méthode getOutputStream n'est pas défini pour un objet BufferedReader...Code:
1
2
3 private PrintWriter sortie; sortie = new PrintWriter(bufRead.getOutputStream(), true);
Sinon quand j'essaye d'envoyer des commandes à mon modem
le modem devrait me répondre, en utilisant le bufReadCode:
1
2
3 String messageString = "AT+CSQ"; System.out.println("Envoi de "+messageString); outputStream.write(messageString .getBytes());
je lis ce que j'envoie et non ce que mon modem devrait me renvoyer...Code:
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 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 :)
Désolé c'étais pour un socket.
Pour l'API, est-ce que tu fais ainsi ?
Code:
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:
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 }
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 !
Où vous avez changé ça? Est ce que vous avez changer ce codepar celui ciCode:
1
2 private PrintWriter sortie; sortie = new PrintWriter(bufRead.getOutputStream(), true);
? Svp si vous trouvez correctement comment envoyer les commandes AT au modem aidez moi car je me bloque.Merci d'avanceCode:
1
2 private PrintWriter sortie; sortie = new PrintWriter(outputStream.write(messageString .getBytes()), true);
tout simplement comme ça:
puis:Code:sortie = new PrintWriter(outputStream, true);
je mettrais le code complet quand ça marchera bien :PCode:
1
2
3 String messageString = "AT"; System.out.println("Envoi de "+messageString); sortie.println(messageString);
mais en mettant ce code j'arrive à avoir la réponse "OK" du modem, ça veut dire que ma commande passe correctement !
Comment tu peux etre sur que le modem a répondu "OK". Avec ça?Code:
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"); }
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.
Pour envoyer un SMS j'envoie en ligne de commande:Code:
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; } } }
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 !
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
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é :P
J'espère que tu vas résoudre le problème, n'hésite pas à poster ici l'avancement.
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.
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
Pourquoi vous utilisez un thread? quand vous le lancez qu'est ce qu'il exécute exactement?
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 parCode:
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; } }
?Code:messageLuStr = bufRead.readLine()
Merci d'avance