我找到了使用 java comm 发送短信的免费源项目: http://code.google.com/p/find-ur-pal/source/browse/src/?r=21
发送短信的函数如下所示:
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 步中,我发送 atz 命令并得到响应,然后命令 ath0 并响应 OK,然后命令 at+cmgl=\"ALL\"并再次响应 OK,但是我的消息在哪里?我在想最后的响应 (getIncommingString) 应该包含从收件箱读取的消息。
我知道是 SMSLib 和其他库。但是要使用这些库,我必须添加很多其他库(用于日志记录)。我想要一个简单的应用程序来发送和接收短信。
谢谢
最佳答案
如果您正在从 SIM 卡读取 SMS,那么您必须首先执行 AT+CMGL 以找出存储的任何 SMS(SMS-DELIVER)的索引。然后你需要使用 AT+CMGR 来读取特定的短信。您是在 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 卡实际上可能变得无法使用。
关于java - 如何使用 java comm 从 gsm 读取短信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8826902/