どのようにJavaのCOMMを使用して、GSMのSMSを読むには?
-
27-10-2019 - |
質問
私は、JavaのCOMMを使用してSMSを送信するために自由なソースプロジェクトを見つけました: http://code.google.com/ P /見つける-UR-PAL /ソース/閲覧/ srcに/?R = 21 の
このようにSMSのルックスを送信する機能:
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コマンドは、仕様に応じて送信されます。そして、それは完璧に動作しますが、今は受信トレイからのSMSを読みました。
:私はこのような書き込みと同様の機能を持っています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コマンドを送信し、私は、応答OKを得た後、コマンドATH0と応答OKしてから、コマンド+ cmgl =再び\「ALL \」と応答OKで、私のメッセージはどこにありますか?私は、最後の応答(getIncommingString)のメッセージが受信トレイから読んで含まれている必要がありますを考えていた。
私はSMSLibや他のライブラリをしていることを知っています。しかし、私は(ロギング用)他のライブラリの追加多くに持っているライブラリを使用します。私は、SMSを送受信する簡単なアプリケーションを持っていると思います。
おかげ
解決
あなたはSIMカードからSMSのを読んでいるなら、あなたは最初にすべてのSMSの(SMS-提供)保存のインデックスを見つけるためにAT + CMGLを実行する必要があります。次に、特定のSMSを読むために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"
あなたのSIMカードに保存されているSMSメッセージを防ぐことができ、別のオプションがあります。これを有効にする迷惑メールを設定するには、AT + CNMIコマンドを使用して制御されます。 SMSを受信するたびにその後、あなたは非同期+ CMTメッセージが表示されます。あなたはその1についてもっと知りたい場合はちょうど私に知らせます。
迷惑アプローチを利用し、いくつかの利点があります。主なものは、あなたのSIMカードのメモリ(それは完全な得ることのリスクなし)を管理する必要はありませんもの。また、SMSのあなたのSIMカードを大量に実際に使用できなくなることがあります。