如何在串口上写入以获取java中调制解调器的来电显示?

时间:2016-05-25 11:17:07

标签: java serial-port serial-communication rxtx tapi

正在使用java语言处理调用者ID。我有usb机器人调制解调器,这个调制解调器与电话线连接。我希望在手机响铃时从此调制解调器获取来电显示。

我在我的示例项目中使用RXTX库来调用id,现在正在与系统的串口通信,我成功读取并从端口写入数据。

当手机响铃时,java程序给出输出:响铃,但是当我将命令传递给调制解调器以获得来电显示时,输出为:ERROR

以下是示例代码,请帮我显示来电显示。

我的调制解调器是usb机器人调制解调器

package rxtx.demo;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.SerialPort;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Command {

    SerialPort serialPort;

    public Command() {
        super();
    }

    void connect(String portName) throws Exception {
        CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);
        if (portIdentifier.isCurrentlyOwned()) {
            System.out.println("Error: Port is currently in use");
        } else {
            System.out.println("Connect 1/2");
            CommPort commPort = portIdentifier.open(this.getClass().getName(), 6000);

            if (commPort instanceof SerialPort) {
                System.out.println("Connect 2/2");
                 serialPort = (SerialPort) commPort;
                System.out.println("BaudRate: " + serialPort.getBaudRate());
                System.out.println("DataBIts: " + serialPort.getDataBits());
                System.out.println("StopBits: " + serialPort.getStopBits());
                System.out.println("Parity: " + serialPort.getParity());
                System.out.println("FlowControl: " + serialPort.getFlowControlMode());
                serialPort.setSerialPortParams(4800, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_ODD);
                //serialPort.setFlowControlMode(SerialPort.FLOWCONTROL_RTSCTS_IN);
                System.out.println("BaudRate: " + serialPort.getBaudRate());
                System.out.println("DataBIts: " + serialPort.getDataBits());
                System.out.println("StopBits: " + serialPort.getStopBits());
                System.out.println("Parity: " + serialPort.getParity());
                System.out.println("FlowControl: " + serialPort.getFlowControlMode());
                InputStream in = serialPort.getInputStream();
                OutputStream out = serialPort.getOutputStream();

                (new Thread(new SerialReader(in))).start();
                (new Thread(new SerialWriter(out, in))).start();

                //out.write("AT&Zn?".getBytes());
                //out.flush();
            } else {
                System.out.println("Error: Only serial ports are handled by this example.");
            }
        }
    }

    /**
     *
     */
    public static class SerialReader implements Runnable {

        InputStream in;

        public SerialReader(InputStream in) {
            this.in = in;
        }

        public void run() {
            byte[] buffer = new byte[1024];
            int len = -1;
            try {
                while ((len = this.in.read(buffer)) > -1) {
                    //System.out.println("Received a signal.");
                    System.out.print(new String(buffer, 0, len));
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    /**
     *
     */
    public static class SerialWriter implements Runnable {

        OutputStream out;
        InputStream in;

        public SerialWriter(OutputStream out, InputStream in) {
            this.out = out;
            this.in = in;
        }

        public void run() {
            try {


                byte[] array = {0x1B, 0x50, 0x0D, 0x0A};
                while (true) {
                    //this.out.write("AT#CID=1".getBytes());
                    this.out.write("AT+GCI=B5".getBytes());
                    //this.out.write("AT+VCID=2".getBytes());
                    this.out.write("AT+VCID=1".getBytes());

                    this.out.write(new byte[]{0x1B, 0x50, 0x0D, 0x0A});
                    this.out.flush();
                    Thread.sleep(1000);

                    byte mBytesIn[] = new byte[1024];
                    //this.in.read(mBytesIn);
                    this.in.read(mBytesIn);
                    String value = new String(mBytesIn);
                    System.out.println("Response from Serial Device: " + value);
                }
            } catch (IOException | InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        try {
            (new Command()).connect("COM6");
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

1 个答案:

答案 0 :(得分:0)

确保发送AT命令初始化调制解调器以及AT + VCID = 1(或其等效值)以启用来电显示功能。

确认您的电话公司是否存在此类服务也很有用。