Wie SMS von GSM mit Java comm lesen?
-
27-10-2019 - |
Frage
Ich fand Projekt frei source sms mit Java comm senden: http://code.google.com/ p / find-ur-pal / Quelle / browse / src /? r = 21
Funktion Senden von SMS sieht wie folgt aus:
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-Befehle senden, gemäß den Spezifikationen. Und es funktioniert perfekt, aber jetzt habe ich sms aus dem Posteingang lesen. Ich habe Schreib ähnliche Funktion wie folgt aus:
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() ;
}
In Schritt 1 I ATZ-Befehl senden, und ich bekam Antwort OK dann Befehl ath0 und Antwort OK und Befehl dann bei + CMGL = \ „ALLE \“ und wieder Antwort OK, aber wo sind meine Nachrichten? Ich dachte dann die letzte Antwort (getIncommingString) sollte enthalten Nachrichten aus Posteingang lesen.
Ich weiß, dass SMSLib und andere Bibliotheken sind. Aber dass die Bibliotheken verwenden ich hinzugefügt eine Menge anderer Bibliotheken (für Logging). Ich mag einfache Anwendung hat SMS zu senden und empfangen.
Danke
Lösung
Wenn Sie SMS die von der SIM-Karte lesen, dann müssen Sie zuerst AT + CMGL ausführen, um die Indizes der ANY (SMS-LIEFERT) der SMS, um herauszufinden, gespeichert. Dann brauchen Sie AT + CMGR verwenden, um eine bestimmte SMS zu lesen. Sind Sie arbeiten im PDU-Modus oder Textmodus?
So wie eine Randnotiz. Warum senden Sie ATZ und ATH0 Befehle? Dies sind Profil und anrufbezogene Befehle.
alle Nachrichtenstatus von Ihrem Modem erlaubt sehen:
AT+CGML=?
Eine typische Antwort wäre:
+CMGL: ("REC UNREAD","REC READ","STO UNSENT","STO SENT","ALL")
So bei allen Meldungen auf dem SIM-Karte aussehen:
AT+CGML="ALL"
Um zu sehen, alle ungelesenen (neu) Nachrichten auf der SIM-Karte:
AT+CGML="REC UNREAD"
Es gibt eine andere Möglichkeit, wo Sie SMS verhindern können Nachrichten auf der SIM-Karte gespeichert werden. Dies wird gesteuert, indem die AT + CNMI Befehl unerwünschte Nachrichten zu konfigurieren, aktiviert werden. Dann, wenn eine SMS empfangen wird, dann werden Sie eine + CMT Nachricht asynchron empfangen. Wenn Sie mehr über das man wissen wollen, lassen Sie es mich wissen.
Es gibt ein paar Vorteile Verwendung des unverlangten Ansatzes zu machen. Die wichtigste davon ist, Sie nicht über Ihre SIM-Karten-Speicher verwalten müssen (keine Gefahr der es immer voll ist). Auch mit großen Mengen von SMS ist Ihre SIM-Karte kann tatsächlich unbrauchbar werden.