java jssc modem发送消息

时间:2016-09-23 10:41:30

标签: java jssc

我正在尝试使用基于SIM900的单元调制解调器从Java / Netbeans发送短信。使用TeraTerm,我验证我可以使用带有基本AT命令的调制解调器发送消息。以下代码尝试使用jssc发送邮件 我没有收到错误,数据似乎写入调制解调器,但我从未收到短信。对于电话号码,我已尝试使用+和没有。{ 在TeraTerm中,数字必须没有+才能生效。已经尝试了许多变体,并且使用了许多.println。仍然没有取得进展 我希望有人能看到我的方式错误。

提前致谢。道格

package jssc_test;

import jssc.SerialPort; 
import jssc.SerialPortException;
import jssc.SerialPortList;

public class Jssc_test {

    public static SerialPort serialPort=null;

    public static void main(String[] args) throws InterruptedException {
        try {
            String[] portNames = SerialPortList.getPortNames();
            for(int i = 0; i < portNames.length; i++){
                System.out.println(portNames[i]);
            }

            if(portNames.length < 1){
                System.out.println("No ports available");
                System.exit(0);
            }
            else{
                serialPort = new SerialPort(portNames[0]);
            }
            System.out.println("Port opened: " + serialPort.openPort());
            System.out.println("Params set: " + serialPort.setParams(9600, 8, 1, 0));
            System.out.println("\"Hello World!!!\" successfully writen to port: " + serialPort.writeBytes("Hello World!!!".getBytes()));

            serialPort.writeBytes(" AT+CMGF=1".getBytes());
            Thread.sleep(1000);
            System.out.println("bytes back = " + serialPort.readString());
            serialPort.writeBytes(" AT+CMGS=\"585*******\"".getBytes()); // \r = <CR>.  Tried both with and without '+'.  In TeraTerm, only works without +.  error if use: \r\n
            //Thread.sleep(1000);
            //System.out.println("bytes back = " + serialPort.readString());
            //serialPort.writeBytes("0x0D".getBytes()); // send <CR>
            Thread.sleep(1000);
            System.out.println("bytes back = " + serialPort.readString());
            serialPort.writeBytes("THIS IS A TEST from DS.".getBytes()); // placing Cntr-Z string in text did not work:  \u001A
            //serialPort.writeBytes("0x0D".getBytes()); // send <CR>
            serialPort.writeBytes("0x1A".getBytes()); // send <ctrl>Z
            Thread.sleep(1000);
            System.out.println("bytes back = " + serialPort.readString());

            System.out.println("Port closed: " + serialPort.closePort());
        }
        catch (SerialPortException ex){
            System.out.println(ex);
        }
    } // ******************* end main ***************

} // *********************** end main class ***********************

1 个答案:

答案 0 :(得分:0)

我能够回答我上面提出的问题。下面的代码工作。事件监听器不需要在那里。帮助的主要变化是将新行和文件结束定义为字节&#34;公共静态最终字节eof = 0x1A,nl = 0x0D;&#34;然后将命令与#34; serialPort.writeByte(nl);&#34;分开写入serialPort。我希望这有助于其他人。

道格

PS:我编写了一个java类,可以简化使用jssc向SIM900发送代码的情况,如果有人有兴趣的话。

    package jssc_test;

//import jssc.SerialPort; 
//import jssc.SerialPortException;
//import jssc.SerialPortList;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
import java.util.logging.Level;
import java.util.logging.Logger;
import jssc.*;
import static jssc.SerialPort.PURGE_RXCLEAR;
import static jssc.SerialPort.PURGE_TXCLEAR;
import static jssc_test.Jssc_test.serialPort;
/**
 *
 * @author DStockman
 */
public class Jssc_test {

    public static SerialPort serialPort=null;
    public static final Byte eof = 0x1A, nl=0x0D;
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws InterruptedException {
        //SerialPort serialPort = null;
    try {
        String[] portNames = SerialPortList.getPortNames();
    for(int i = 0; i < portNames.length; i++){
        System.out.println(portNames[i]);
    }

        if(portNames.length < 1){
            System.out.println("No ports available");
            System.exit(0);
        }
        else{
            serialPort = new SerialPort(portNames[0]);
        }
        System.out.println("Port opened: " + serialPort.openPort());
        System.out.println("Params set: " + serialPort.setParams(9600, 8, 1, 0));

        serialPort.writeBytes("ATI".getBytes()); // get modem ID
        serialPort.writeByte(nl);
        Thread.sleep(1000);
        System.out.println("modem ID = " + serialPort.getEventsMask());

        /*
        int mask = SerialPort.MASK_RXCHAR + SerialPort.MASK_CTS + SerialPort.MASK_DSR;//Prepare mask
        serialPort.setEventsMask(mask);//Set mask
        try{
            serialPort.addEventListener(new SerialPortReader());//Add SerialPortEventListener
        }
        catch (SerialPortException ex) {
            System.out.println(ex);
        }
        */

        // just looking up settings
        System.out.println("events mask = " + serialPort.getEventsMask());
        System.out.println("flow control mode = " + serialPort.getFlowControlMode());
        System.out.println("output buffer bytes = " + serialPort.getOutputBufferBytesCount());
        //serialPort.purgePort(PURGE_RXCLEAR | PURGE_TXCLEAR);

        serialPort.writeBytes(" AT+CMGF=1".getBytes());
        serialPort.writeByte(nl);
        Thread.sleep(1000);
        System.out.println("bytes back set modem to text mode = " + serialPort.readString());
        System.out.println("Success entering number: " + serialPort.writeBytes(" AT+CMGS=\"5857738696\";".getBytes())); // \r = <CR>.  Tried both with and without '+'.  In TeraTerm, only works without +.  error if use: \r\n
        serialPort.writeByte(nl);
        Thread.sleep(1000);
        System.out.println("bytes back after number entered = " + serialPort.readString());
        serialPort.writeBytes("THIS IS A third TEST from DS 09/29/16.2.".getBytes()); 
        serialPort.writeByte(nl);
        Thread.sleep(1000);
        serialPort.writeByte(eof);
        Thread.sleep(1000);
        System.out.println("bytes back = " + serialPort.readString());
        Thread.sleep(10000);
        //serialPort.purgePort(SerialPort.PURGE_TXCLEAR);

        //attempt to get msgs received by modem
        serialPort.writeBytes("AT+CMGL=\"ALL\"".getBytes()); 
        serialPort.writeByte(nl);
        Thread.sleep(1000);
        System.out.println("bytes back = " + serialPort.readString());

        System.out.println("Port closed: " + serialPort.closePort());
    }
    catch (SerialPortException ex){
        System.out.println(ex);
    }
    } // ******************* end main ***************

} // *********************** end main class ***********************


class SerialPortReader implements SerialPortEventListener {

    public void serialEvent(SerialPortEvent event) {
        if(event.isRXCHAR()){//If data is available
            if(event.getEventValue() == 1){//Check bytes count in the input buffer
                //Read data, if 10 bytes available 
                try {
                    System.out.println("bytes back inside listener = " + serialPort.readString());
                    byte buffer[] = Jssc_test.serialPort.readBytes(10);
                    System.out.println("listener text:");
                    System.out.print(Arrays.toString(buffer));
                    System.out.println("End listener text:");
                }
                catch (SerialPortException ex) {
                    System.out.println(ex);
                }
            }
        }
        else if(event.isCTS()){//If CTS line has changed state
            if(event.getEventValue() == 1){//If line is ON
                System.out.println("CTS - ON");
            }
            else {
                System.out.println("CTS - OFF");
            }
        }
        else if(event.isDSR()){///If DSR line has changed state
            if(event.getEventValue() == 1){//If line is ON
                System.out.println("DSR - ON");
            }
            else {
                System.out.println("DSR - OFF");
            }
        }
    }
}