2012-04-03 41 views
1

这是一个程序,它应该发送短信给任何号码,但失败。它可以连接端口但不发送任何消息。请帮忙的人?Java短信网关可以与通讯端口连接,但不发送消息

package mateorssms; 

import java.io.*; 
import java.util.*; 
import javax.comm.*; 


public class GSMConnect implements SerialPortEventListener, 
CommPortOwnershipListener { 

private String comPort = "COM3"; // This COM Port must be connect with GSM Modem or your mobile phone 
private String messageString = "hi there!"; 
private CommPortIdentifier portId = null; 
private Enumeration portList; 
private InputStream inputStream = null; 
private OutputStream outputStream = null; 
private SerialPort serialPort; 

/** 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)) { 
     return true; 
     } 
    } 
    } 
    return false; 
} 

public void checkStatus() { 
send("AT+CREG?\r\n"); 
    //reurn outt; 
} 

public void dial(String phoneNumber) { 
    try { 
//dial to this phone number 
    messageString = "ATD" + phoneNumber + ";\n\r"; 
    outputStream.write(messageString.getBytes()); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
} 


public void send(String cmd) { 
    try { 
     outputStream.write(cmd.getBytes()); 
    inputStream = serialPort.getInputStream(); 
    System.out.println(" Input Stream... " + inputStream.toString()); 

    } catch (IOException e){ 
    e.printStackTrace(); 
    } 

} 

public void sendMessage(String phoneNumber, String message) { 
    //send("AT+CMGS=\"" + phoneNumber + "\"\r\n"); 

    send("AT+CMGS=\""+phoneNumber+"\"\r\n"); 
    send(message + '\032'); 

} 



public void hangup() { 
    send("ATH\r\n"); 
} 





public void connect() throws NullPointerException { 
    if (portId != null) { 
    try { 
     portId.addPortOwnershipListener(this); 
     serialPort = (SerialPort) portId.open("MobileGateWay", 2000); 
    } catch (PortInUseException 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); 
    } catch (TooManyListenersException e) { 
     e.printStackTrace(); 
    } 

//Register to home network of sim card 

    send("ATZ\r\n"); 

    } else { 
    throw new NullPointerException("COM Port not found!!"); 
    } 
} 

@Override 
public void serialEvent(javax.comm.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: 
    case SerialPortEvent.OUTPUT_BUFFER_EMPTY: 
    case SerialPortEvent.DATA_AVAILABLE: 

     byte[] readBuffer = new byte[2048]; 
     try { 
     while (inputStream.available()>0) 
     { 
      int numBytes = inputStream.read(readBuffer); 
     } 
//print response message 
     System.out.print(new String(readBuffer)); 
     } catch (IOException e) { 
     } 
     break; 
    } 
} 

@Override 
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 static void main(String args[]) { 
    GSMConnect gsm = new GSMConnect("COM3"); 
    if (gsm.init()){ 
    try { 
     gsm.connect(); 
     gsm.checkStatus(); 
     Thread.sleep(3000); 
     gsm.sendMessage("01911507103", "Your Message"); 
     Thread.sleep(3000); 
     gsm.hangup(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    } else { 
    System.out.println("Can't init this card"); 
    } 
} 
} 

这里是我在Netbeans 7.1中运行时的输出。

run: 
COM3: PORT_OWNED 
Input Stream... [email protected] 
Input Stream... [email protected] 
ATZ 
OK 
Input Stream... [email protected] 
AT+CMGS="01911507103" 
Input Stream... [email protected] 
ERROR 
Input Stream... [email protected] 
ATH 
OK 

在此先感谢...

回答

0

尝试把调制解调器短信模式AT+CMGF=1

如果还是不行,请尝试使用AT+CMGW="<number>"\r\n<message>发送短信将存储短信在内存中并返回索引,例如+CMGW: <index>。然后发出命令AT+CMSS=<index>实际发送它。

还有两件事可能有帮助;

  • flush()您的输出流在send方法中。
  • 将二者结合起来send()操作中sendMessage()只有一个send()

像这样:

public void sendMessage(String phoneNumber, String message) { 
    send("AT+CMGS=\""+phoneNumber+"\"\r\n" + message + '\032'); 
}