11

Java API の実装に成功し、SMS の送信と通話の発信を開始しましたが、着信に応答することserialPort.notifyOnRingIndicator(true);ができません。

  1. 入力バッファの読み取りを試みましたが、「RING」の検出時にATAコマンドを送信しましたが、InputStreamからコンソールに直接書き込まれたときにRINGが含まれていても、RINGを検出できません
  2. シリアル イベント ハンドラで FROM Case RI(Ring Indicator) のときに ATA コマンドを送信しようとしました。

IVR システムを実装しようとしています。このシナリオで ATA コマンドを送信する方法、RING を検出する方法、および RI イベントが発生しない理由

コード

package sample;



    import java.io.*;
    import java.util.*;

    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 = "COM6"; // 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\\SACHIN\\Desktop\\7001110.mp3";
            InputStream in;
            try {
                in = new FileInputStream(gongFile);
                 // create an audiostream from the inputstream
               // AudioStream audioStream = new AudioStream(in);
                // play the audio clip with the audioplayer class
               // AudioPlayer.player.start(audioStream);
                Clip clip = AudioSystem.getClip();
                AudioInputStream inputStream = AudioSystem.getAudioInputStream(
                  Main.class.getResourceAsStream(gongFile));
                clip.open(inputStream);
                clip.start(); 
            } catch (IOException | UnsupportedAudioFileException | LineUnavailableException e) {
                // TODO Auto-generated catch block
                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) {
       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");

        /*try {
            Thread.sleep(5000);
            send("ATA");
        } catch (InterruptedException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }*/
        break;
         case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
         case SerialPortEvent.DATA_AVAILABLE:

           byte[] readBuffer = new byte[2048];
           try {
             while (inputStream.available() > 0) 
             {
               int numBytes = inputStream.read(readBuffer);

               System.out.print(numBytes);
               if((readBuffer.toString()).contains("RING")){
               System.out.println("Enter Inside if RING Loop");    


               welcomeMessage();
               }
             }
             //readBufferTrial=readBufferTria;//+new String(readBuffer)+new Date();
             //print response message
             System.out.print(new String(readBuffer));
           } 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=1");
           Thread.sleep(7500);
           System.out.println("After Auto Answer set");

        //   gsm.sendMessage("87SSSXXX9105", "Trial Success ");
           Thread.sleep(5000);
         //   gsm.sendMessage("+919633XXXXX", "Third Msg");
         //  Thread.sleep(1000);
         //  gsm.dial("87SSSXXX9105");
         //  gsm.dial("87SSSXXX9105");
         //  Thread.sleep(1000);
         //  gsm.welcomeMessage();
        //   Thread.sleep(1000);
         //  gsm.welcomeMessage();// for turning on Echo ATE1&W

           Thread.sleep(20000);

           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");
       }
     }


    }

編集:-

モデムの初期化後に AT コマンドを使用して自動応答モードを設定することにより、コールに自動応答する方法を見つけましたが、常に信頼できるとは限りません。モデムを使用している目的のために、オーディオ クリップを再生するタイミングを正しくする必要があります。 AT コマンドを使用した自動応答は通話に応答しますが、音声の再生の問題は残ります。したがって、リングを検出する方法を見つける方法が必要です。

4

2 に答える 2

1

特定の API と話すことも、イベントを取得できない理由についても話すことができません。ただし、RING を探して inputStream を解析するバックアップ計画には、いくつかの潜在的な問題があります。

主なものは、実装が同じ読み取り操作で送信/読み取りされるRINGに依存していることです。その保証はありません。基礎となる API の実装によっては、一度に 1 バイトずつストリームを取得する可能性があります (この場合、RING は別個の文字列として取得されます)。

私の推奨事項は、StringBuffer を作成し、入力がある限り StringBuffer を追加してから、StringBuffer をチェックすることです。

何かのようなもの :

 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.print(numBytes);
     }
     if((sb.toString()).contains("RING")){
        System.out.println("Enter Inside if RING Loop");    
        welcomeMessage();
     }
     //print response message
     System.out.print(sb.toString());
   } catch (IOException e) {
   }
   break;
于 2015-07-31T13:21:40.147 に答える
0

スイッチケースを見てください。壊れていません。それが問題かもしれません。

case SerialPortEvent.RI:
            if( serialPortEvent.getNewValue() ) 
            {
                System.out.println("Ring Indicator On");
            }
            else 
            {
                System.out.println("Ring Indicator Off");
            }
            break;
于 2015-07-31T06:13:32.137 に答える