如何阅读使用Java通信的GSM GSM短信?
我发现免费的源项目发送使用Java通讯短信: http://code.google.com/p/find-ur-pal/source/browse/src/?r=21如何阅读使用Java通信的GSM GSM短信?
功能发送短信是这样的:
public void run(){
boolean timeOut=false;
long startTime=(new Date()).getTime();
while ((step <7) && (!timeOut)){
// log(""+((new Date()).getTime() - startTime);
//check where we are in specified delay
timeOut=((new Date()).getTime() - startTime)>delay;
//if atz does not work, type to send cntrlZ and retry, in case a message was stuck
if (timeOut && (step==1)) {
step=-1;
mySerial.send( ""+cntrlZ);
}
//read incoming string
String result= mySerial.getIncommingString() ;
// log ("<- "+result+"\n--------");
int expectedResult=-1;
try{
//log ("Step:"+step);
switch (step){
case 0:
mySerial.send("atz");
delay=LONG;
startTime=(new Date()).getTime();
break;
case 1:
delay=STANDARD;
mySerial.send("ath0");
startTime=(new Date()).getTime();
break;
case 2:
expectedResult=result.indexOf("OK");
//log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+cmgf=1");
startTime=(new Date()).getTime();
}else{
step=step-1;
}
break;
case 3:
expectedResult=result.indexOf("OK");
// log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+csca=\""+csca+"\"");
startTime=(new Date()).getTime();
}else{
step=step-1;
}
break;
case 4:
expectedResult=result.indexOf("OK");
// log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+cmgs=\""+recipient+"\"");
startTime=(new Date()).getTime();
}else{
step=step-1;
}
break;
case 5:
expectedResult=result.indexOf(">");
// log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send(message+cntrlZ);
startTime=(new Date()).getTime();
}else{
step=step-1;
}
delay=VERYLONG;//waitning for message ack
break;
case 6:
expectedResult=result.indexOf("OK");
//read message number
if (expectedResult>-1){
int n=result.indexOf("CMGS:");
result=result.substring(n+5);
n=result.indexOf("\n");
status=0;
messageNo=Long.parseLong(result.substring(0,n).trim());
log ("sent message no:"+messageNo);
}else{
step=step-1;
}
break;
}
step=step+1;
aThread.sleep(100);
}catch (Exception e){
e.printStackTrace();
}
}
mySerial.closeConnection() ;
//if timed out set status
if (timeOut) {
status=-2;
log("*** time out at step "+step+"***");
}
}
AT命令按照规范发送。它完美的作品,但现在我从收件箱中读取短信。我有写类似的功能是这样的:
public void receiveMessage() throws Exception
{
int expectedResult = 0;
SerialParameters params = defaultParameters;
mySerial =new SerialConnection (params);
mySerial.openConnection();
// step 1
mySerial.send("atz");
delay=LONG;
Thread.sleep(100);
//aThread.sleep(100);
String result= mySerial.getIncommingString() ;
// step 2
delay=STANDARD;
mySerial.send("ath0");
Thread.sleep(100);
// step 3
result= mySerial.getIncommingString() ;
expectedResult=result.indexOf("OK");
//log ("received ok ="+expectedResult);
if (expectedResult>-1){
mySerial.send("at+cmgf=1");
//startTime=(new Date()).getTime();
}
// step 4
result= mySerial.getIncommingString() ;
expectedResult=result.indexOf("OK");
//log ("received ok ="+expectedResult);
if (expectedResult>-1){
//mySerial.send("at+cmgl=\"ALL\"");
mySerial.send("at+cmgr=1");
//startTime=(new Date()).getTime();
}
Thread.sleep(100);
result= mySerial.getIncommingString() ;
}
在步骤1我在+ CMGL =发送ATZ的命令,我得到了响应OK,然后命令ATH0和响应确定,然后COMMAND \“ALL \”,并再次响应OK,但我的信息在哪里?我在想,最后一个响应(getIncommingString)应该包含从收件箱中读取的消息。
我知道这是SMSLib和其他库。但要使用这些库,我必须添加许多其他库(用于记录)。我想要简单的应用程序来发送和接收短信。
感谢
如果你正在阅读从SIM卡短信的,那么你必须先执行AT + CMGL找出存储任何SMS的(SMS-提供)的索引。然后你需要使用AT + CMGR来读取特定的SMS。你在PDU模式还是文本模式下工作?
就像一个侧面说明。你为什么要发送ATZ和ATH0命令?这些是配置文件和调用相关的命令。
要查看您的调制解调器允许的所有消息状态:
AT+CGML=?
一个典型的反应是:
+CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL")
所以看你的SIM卡上的所有信息:
AT+CGML="ALL"
要查看SIM卡上的所有未读(新消息):
AT+CGML="REC UNREAD"
还有另一种选择,您可以防止SMS消息存储在SIM卡上。这是通过使用AT + CNMI命令配置未经请求的消息来启用的。然后,无论何时接收到SMS,您都将异步收到+ CMT消息。如果你想知道更多关于那个只是让我知道。
利用未经请求的方法有几个好处。主要的一点是你不必管理你的SIM卡记忆(没有充满的风险)。此外,如果使用大量的短信,您的SIM卡实际上可能无法使用。
文本模式,我从谷歌的示例项目复制ATZ和ATH0。 – Robert 2012-01-12 20:04:04
我改变了代码,现在命令AT + CMGL发送并且响应正常,然后我发送AT + CMGR = 1,响应也可以,但是消息索引列表在哪里呢? – Robert 2012-01-12 20:18:44
我注意到我的短信在本地标签中,而在SIM卡中没有任何短信,所以当我运行我的应用程序时,它从SIM卡读取短信,所以我认为这是我仍然有0消息时的原因我使用cmgl命令。当短信到达存储它的gsm时?我如何从本地标签读取短信? (没有保存在SIM卡中)? – Robert 2012-01-12 20:28:34