大家好!
 
   我使用 smslib 开源包来发送接收短信的遇到了一个问题, 
   
   org.smslib.GatewayException: GSM: Invalid CREG response.
at org.smslib.modem.AModemDriver.waitForNetworkRegistration(AModemDriver.java:396)
at org.smslib.modem.AModemDriver.connect(AModemDriver.java:149)
at org.smslib.modem.ModemGateway.startGateway(ModemGateway.java:111)
at org.smslib.Service$1Starter.run(Service.java:227)   每当我发送完  15 条左右的时候, 就出现了这个异常, 紧接着下个异常就是 :  org.smslib.GatewayException: Comm library exception: java.lang.reflect.InvocationTargetException
at org.smslib.modem.SerialModemDriver.connectPort(SerialModemDriver.java:93)
at org.smslib.modem.AModemDriver.connect(AModemDriver.java:106)
at org.smslib.modem.ModemGateway.startGateway(ModemGateway.java:111)
at org.smslib.Service$1Starter.run(Service.java:227)   如果我把服务重新后, 则可以重新发送短信, 国内、国外的几大搜索引擎都找不到很好关于 GSM: Invalid CREG response. 的解决办法。    这个异常指出我不能注册到网关,但是前面的十几条又可以发送, 我开始怀疑是自己的代码问题。 我会贴出我的代码。 希望大家能踊跃参与讨论。
  SendMessage.javaimport java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;import org.smslib.IOutboundMessageNotification;
import org.smslib.Library;
import org.smslib.OutboundMessage;
import org.smslib.Service;
import org.smslib.Message.MessageEncodings;
import org.smslib.modem.SerialModemGateway;import com.hdkjframe.base.util.sendmsg.dao.PopMspDAO;
import com.hdkjframe.base.util.sendmsg.vo.PopMsp;
import com.hdkjframe.base.util.sendmsg.vo.ReportMsg;public class SendMessage {
Service srv = null; // 发送短信
public void doIt(ArrayList msgList)  {
System.out.println("正在发送短信了........");
try{
int successFlag = 0;  // 记录成功发送短信的条数
OutboundMessage msg = null; OutboundNotification outboundNotification = new OutboundNotification(); srv = new Service(); SerialModemGateway gateway = new SerialModemGateway("modem.com1","COM1", 9600, "wavecom", "T02i");

gateway.setInbound(true);
gateway.setOutbound(true);
gateway.setSimPin("0000");
gateway.setOutboundNotification(outboundNotification);

//  gateway.isStarted(); //判断连接是否打开

srv.addGateway(gateway);
srv.startService(); // Send a message synchronously.
// 循环发送同步消息。

for(int i=0;i<msgList.size();i++){
PopMsp popMsp = (PopMsp) msgList.get(i);
msg = new OutboundMessage(popMsp.getRecieveName(), popMsp.getSendNote());
msg.setEncoding(MessageEncodings.ENCUCS2);// 这句话是发中文短信必须的
srv.sendMessage(msg);

// 如果消息发送成功
if(msg.getMessageStatus().toString().trim().equals("SENT") || 
msg.getMessageStatus().toString().trim().equals("send")){

SendMessage sendMessage = new SendMessage();
// 发送成功, 则修改消息的状态和发送时间
boolean flag = sendMessage.updateMsgState(popMsp.getLsh());

if(flag){
// 记录成功发送消息的条数
successFlag ++;
}
}

System.out.println(msg);


// 停止服务
srv.stopService();
System.out.println("**************************短信发送( "+successFlag+" 条短信)完毕***************************");
}catch(Exception e){
System.out.println("发送短信出现异常,请检查设备及其连接状态....");
e.printStackTrace();
}
}

// 根据消息是否发送成功来修改对应消息的状态 
public boolean updateMsgState(String lsh){
boolean flag = true;
try {
// 如果成功发送休息的话, 则修改消息状态为 1 表示成功发送消息.
PopMspDAO popMspDao = PopMspDAO.getInstence();
PopMsp popMsp = (PopMsp) popMspDao.findById(lsh);
popMsp.setMsgState(new Long(1));
popMsp.setSendTime(this.transToDate(new Date().toLocaleString()));
popMspDao.saveOrUpdate(popMsp);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
flag = false;
}finally{
return flag;
}
}

// 时间转换格式
    private Date transToDate(String s) {
     Date date = null;
     if (s != null) {
     SimpleDateFormat sdf = new SimpleDateFormat();
     if (s.indexOf(" ") != -1) {
     sdf.applyPattern("yyyy-MM-dd HH:mm:ss");
     try {
date = sdf.parse(s);
} catch (ParseException e) {
sdf.applyPattern("yyyy.MM.dd HH:mm:ss");
try {
date = sdf.parse(s);
} catch (ParseException e1) {
}
}
     } else {
     sdf.applyPattern("yyyy-MM-dd");
     try {
date = sdf.parse(s);
} catch (ParseException e) {
sdf.applyPattern("yyyy.MM.dd");
try {
date = sdf.parse(s);
} catch (ParseException e1) {
}
}
     }
     }
     return date;
    }

public class OutboundNotification implements IOutboundMessageNotification {
public void process(String gatewayId, OutboundMessage msg) {
System.out.println("Outbound handler called from Gateway: "
+ gatewayId);
System.out.println(msg);
}
} public static void main(String args[]) {
SendMessage app = new SendMessage();
try {
// app.doIt(new ArrayList());
} catch (Exception e) {
System.out.println("123123"+e.toString());
}
}
}