Как прочитать смс из GSM с помощью Java Comm?
-
27-10-2019 - |
Вопрос
Я нашел проект с бесплатным исходным кодом для отправки смс с помощью 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-команды отправляются в соответствии со спецификациями.И все работает отлично, но теперь я читаю смс из Inbox.Я написал аналогичную функцию следующим образом:
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 и ответ ОК, а затем команду at+cmgl=\"ALL\" и снова ответ ОК, но где мои сообщения?Я думал, что тогда последний ответ (getIncommingString) должен содержать сообщения, прочитанные из папки «Входящие».
Я знаю, что есть SMSLib и другие библиотеки.Но чтобы использовать эти библиотеки, мне нужно добавить множество других библиотек (для ведения журналов).Я хочу иметь простое приложение для отправки и получения смс.
Спасибо
Решение
Если вы читаете SMS-сообщения с SIM-карты, вам необходимо сначала выполнить команду AT+CMGL, чтобы узнать индексы всех сохраненных SMS-сообщений (SMS-DELIVER).Затем вам нужно использовать 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-карты (нет риска ее переполнения).Кроме того, при большом количестве SMS-сообщений ваша SIM-карта может стать непригодной для использования.