serial rs232 puertos manejo giovynetdriver giovynet comunicacion commportidentifier java multithreading audio rxtx

rs232 - manejo de puertos usb en java



Java multiprocesamiento para IVRS con módem GSM rxtx(reproducción de archivos de voz haciendo que el programador de eventos deje de funcionar) (1)

Si no dedico una buena cantidad de tiempo a reproducir su entorno, puedo darle dos sugerencias sobre cómo analizar esto.

a) Coloque un try-catch Throwable alrededor de su controlador completo - a menudo lanzando excepciones puede romper los despachadores de eventos

B) imprima una declaración de depuración cuando ingrese y salga de su manejador de eventos y asegúrese de que estén emparejados y de que obtenga una salida después de su última entrada; un bloqueo de subprocesos a veces impedirá que se despachen eventos futuros.

Por cierto, tienes un enunciado de catch vacío en un solo lugar, esos me asustan porque a menudo enmascaran problemas de maneras que pueden desperdiciar días de tu tiempo. Si sabe que quiere comer allí una excepción en silencio y espera que se produzca una excepción lo suficiente como para contaminar sus registros para registrarla, por favor haga un comentario que lo diga.

He implementado un programa para recibir llamadas usando el módem gsm. Al detectar la llamada "RING" se responde, un clip de audio se reproduce llamando a una función desde dentro DATA_AVAILABLE EVENT HANDLER. Pero el controlador de eventos deja de funcionar después de esto. Después de que se completa el audio. Handler ya no muestra ningún evento recibido de datos

¿Por qué el lista de eventos deja de funcionar? ¿Lo estoy haciendo mal al reproducir el audio desde el controlador del evento? Estaba pensando en establecer una variable verdadera o falsa desde el controlador de eventos data_received y crear un controlador de eventos personalizado para escuchar el cambio a ese variable para hacer la reproducción de audio ¿pueden ambos funcionar simultáneamente de todos modos?

cómo crear una solución de subprocesamiento múltiple Para que la E / S serie no se interrumpa y la Reproducción de audio y el Muestreo de audio se puedan realizar de forma sincronizada para detectar tonos dtmf. ¿Hay alguna forma de que los eventos del puerto serie se puedan escuchar constantemente sin interupton y ejecutar una función para muestreo de audio y reproducción de audio en un momento específico?

Llamada aceptada en este caso de cambio y el hilo se inicia dentro de la función play ()

case SerialPortEvent.DATA_AVAILABLE: StringBuffer sb = new StringBuffer(); byte[] readBuffer = new byte[2048]; try { while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); sb.append(new String(readBuffer,0,numBytes)); System.out.println(numBytes); System.out.println(sb); } System.out.println("Data Available"); if((sb.toString()).contains("RING")){ System.out.println("Enter Inside if RING Loop"); //play(); send("ATA/r/n"); //welcomeMessage(); } if((sb.toString()).contains("CARRIER")){ hangup(); //Thread.sleep(1000); closePort(); outCommand(); System.out.println("Enter Inside if NO CARRIER Loop"); } //print response message System.out.print(sb.toString()); } catch (IOException e) { } break;

public void play() { try { new Thread() { public void run() { for(int i=0;i<1;i++) welcomeMessage(); } }.start(); } catch (Throwable e) { e.printStackTrace(); } }

Código completo

package sample; import java.io.*; import java.util.*; import javax.sound.sampled.*; import javazoom.jl.player.*; import java.io.FileInputStream; import gnu.io.*; import java.io.*; import javax.sound.sampled.AudioInputStream; import javax.sound.sampled.AudioSystem; import javax.sound.sampled.Clip; import javax.sound.sampled.LineUnavailableException; import javax.sound.sampled.UnsupportedAudioFileException; import org.apache.log4j.chainsaw.Main; import sun.audio.*; public class GSMConnect implements SerialPortEventListener, CommPortOwnershipListener { private static String comPort = "COM3"; // This COM Port must be connect with GSM Modem or your mobile phone private String messageString = ""; private CommPortIdentifier portId = null; private Enumeration portList; private InputStream inputStream = null; private OutputStream outputStream = null; private SerialPort serialPort; String readBufferTrial = ""; /** Creates a new instance of GSMConnect */ public GSMConnect(String comm) { this.comPort = comm; } public boolean init() { portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { if (portId.getName().equals(comPort)) { System.out.println("Got PortName"); return true; } } } return false; } public void checkStatus() { send("AT+CREG?/r/n"); } public void dial(String phoneNumber) { try { //dial to this phone number messageString = "ATD" + phoneNumber + ";/r/n"; outputStream.write(messageString.getBytes()); System.out.println("Called "); } catch (IOException e) { e.printStackTrace(); } } public void send(String cmd) { try { outputStream.write(cmd.getBytes()); } catch (IOException e) { e.printStackTrace(); } } public void sendMessage(String phoneNumber, String message) { char quotes =''"''; send("AT+CMGS="+quotes + phoneNumber +quotes+ "/r/n"); try { Thread.sleep(2000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } // send("AT+CMGS=/""+ phoneNumber +"/"/r/n"); send(message + ''/032''); System.out.println("Message Sent"); } public void hangup() { send("ATH/r/n"); } public void welcomeMessage(){ // open the sound file as a Java input stream String gongFile = "C://Users//XXXX//Desktop//1-welcome.wav"; }*/ try{ FileInputStream fis = new FileInputStream("C://Users//XXXX//Desktop//7001110.mp3"); Player playMP3 = new Player(fis); playMP3.play(); System.out.print("welcomeMessage() Read"); }catch(Exception e){ System.out.println(e); } } public void play() { try { new Thread() { public void run() { for(int i=0;i<1;i++) welcomeMessage(); } }.start(); } catch (Throwable e) { e.printStackTrace(); } } public void connect() throws NullPointerException { if (portId != null) { try { portId.addPortOwnershipListener(this); serialPort = (SerialPort) portId.open("MobileGateWay", 2000); serialPort.setSerialPortParams(115200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE); } catch (PortInUseException | UnsupportedCommOperationException e) { e.printStackTrace(); } try { inputStream = serialPort.getInputStream(); outputStream = serialPort.getOutputStream(); } catch (IOException e) { e.printStackTrace(); } try { /** These are the events we want to know about*/ serialPort.addEventListener(this); serialPort.notifyOnDataAvailable(true); serialPort.notifyOnRingIndicator(true); } catch (TooManyListenersException e) { e.printStackTrace(); } //Register to home network of sim card send("ATZ/r/n"); } else { throw new NullPointerException("COM Port not found!!"); } } public void serialEvent(SerialPortEvent serialPortEvent) { System.out.println("serialPortEvent.getEventType()"+serialPortEvent.getEventType()); switch (serialPortEvent.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: // System.out.println("Ringing"); if( serialPortEvent.getNewValue() ) { System.out.println("Ring Indicator On"); } else { System.out.println("Ring Indicator Off"); } break; case SerialPortEvent.OUTPUT_BUFFER_EMPTY: case SerialPortEvent.DATA_AVAILABLE: StringBuffer sb = new StringBuffer(); byte[] readBuffer = new byte[2048]; try { while (inputStream.available() > 0) { int numBytes = inputStream.read(readBuffer); sb.append(new String(readBuffer,0,numBytes)); System.out.println(numBytes); System.out.println(sb); } System.out.println("Data Available"); if((sb.toString()).contains("RING")){ System.out.println("Enter Inside if RING Loop"); //play(); send("ATA/r/n"); //welcomeMessage(); } if((sb.toString()).contains("CARRIER")){ hangup(); //Thread.sleep(1000); closePort(); outCommand(); System.out.println("Enter Inside if NO CARRIER Loop"); } //print response message System.out.print(sb.toString()); } catch (IOException e) { } break; } } public void outCommand(){ System.out.print(readBufferTrial); } public void ownershipChange(int type) { switch (type) { case CommPortOwnershipListener.PORT_UNOWNED: System.out.println(portId.getName() + ": PORT_UNOWNED"); break; case CommPortOwnershipListener.PORT_OWNED: System.out.println(portId.getName() + ": PORT_OWNED"); break; case CommPortOwnershipListener.PORT_OWNERSHIP_REQUESTED: System.out.println(portId.getName() + ": PORT_INUSED"); break; } } public void closePort(){ serialPort.close(); } public static void main(String args[]) { GSMConnect gsm = new GSMConnect(comPort); if (gsm.init()) { try { System.out.println("Initialization Success"); gsm.connect(); Thread.sleep(5000); gsm.checkStatus(); Thread.sleep(5000); // System.out.println("Before Auto Answer"); // gsm.send("ATS0=5"); // gsm.dial("87XXXXXSS"); // Thread.sleep(7500); // System.out.println("After Auto Answer set"); // gsm.sendMessage("8XXXXXS56", "Trial Success Call me"); // gsm.sendMessage("80XXXXS56", "Trial Success Call me"); // gsm.sendMessage("8XXXXSXS6", "Trial Success Call me"); // Thread.sleep(5000); // gsm.sendMessage("+919XXXXXXS3", "Third Msg"); // Thread.sleep(1000); // gsm.dial("9XXXXS773"); // gsm.dial("871XXXXS5"); // Thread.sleep(1000); // gsm.welcomeMessage(); // Thread.sleep(1000); // gsm.welcomeMessage();// for turning on Echo ATE1&W // Thread.sleep(20000); // welcomeMessage(); // gsm.hangup(); // Thread.sleep(1000); // gsm.closePort(); // gsm.outCommand(); // System.exit(1); } catch (Exception e) { e.printStackTrace(); } } else { System.out.println("Can''t init this card"); } } }