Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Получение СМС

290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Приветствую.
Собственно сабж, нужно получать СМС из 3g модема модель: Е1550. Как это реализовать? Даже не знаю с чего начать.
А вообще мне нужно что бы я мог получать все входящие смс на любой номер, в текстовом файле. Спрашивал в СМС сервисах, смогут ли они предоставить такую возможность. Дороговато. Может есть другие еще лучше бесплатные сервисы?)
277
07 февраля 2013 года
arrjj
1.7K / / 26.01.2011
Угу, будут текстом.
Придет спам от оператора - все поломается нафиг
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
Открываешь COM-port модема
пишешь в него AT+CMGL
читаешь сообщения
Список необходимых комманд:

AT+CMGF=0 - сообщения приходять в PDU формате, AT+CMGF=1 - сообщения приходят в текстовом формате (только простые смс, содержащие русские символы будут приходить в pdu или нетекст (ссылки/картинки/мелодии/хзчтоещетамможетбыть) без заголовка (заголовок уже будет расшифрованным)

ресет модема AT+CFUN=0 AT+CFUN=1

AT+CMGL - прочитать сообщения (без параметров выдает только новые непрочитанные)

ATE1 выводить комманды в ответе (echo) ATE0 - не выводить комманды в ответе

AT+CMGD=1,1 - удаление сообщений (только прочитанные, с памяти симкарты)

AT+CPMS="SM" - сохранять сообщения на симке

AT+CNMI=0,0,0,0 - не выводить индикацию о новых сообщениях (а то перемешивается с тветом от комманды, параметры лучше уточнить ( AT+CNMI=? )

В конец каждой комманды надо дописывать символ возврата каретки '\r'


З.Ы. есть готовая прога на Qt/с++ могу сорсы скинуть, если возникнут проблемы
З.З.Ы. для тестов можешь использовать putty
290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Не совсем понял как читать сообщения вот так я подключаюсь к COM-порту:

Код:
HANDLE hCOM=CreateFile(Edit1->Text.c_str()
,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hCOM!=INVALID_HANDLE_VALUE)
{

char buffer[30];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"AT+CMGL");
DWORD nb;
OVERLAPPED ov;
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
CloseHandle(hCOM);
}
А как а как принять ответ?
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
а тут читаешь ответ на комманду, пока не прочтешь OK или ERROR
CloseHandle(hCOM);
290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Цитата: arrjj
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
а тут читаешь ответ на комманду, пока не прочтешь OK или ERROR
CloseHandle(hCOM);



А как ее читать?
ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov); ??? и проверять содержимое?

290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Сделал так:

while(buffer!="AT+CMGL")
{

ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);

Memo1->Text=buffer;
break;

}

Получаю только:
OK
L

А как мне получить инфу сообщния?
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
а ты на него смс отправь чтоб непрочитанным висело
290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Цитата: arrjj
а ты на него смс отправь чтоб непрочитанным висело



Не хочет работать:

Код:
HANDLE hCOM=CreateFile(Edit1->Text.c_str()
,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hCOM!=INVALID_HANDLE_VALUE)
{
                  //AT+CMGF=1
                  DWORD nb;
OVERLAPPED ov;
char buffer[30];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"AT+CMGF=1");
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
strcpy(buffer,"AT+CMGL=\"ALL\"\r");
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
while(buffer!="AT+CMGL=REC READ")
{

  ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
  ShowMessage(buffer);
  Memo1->Text=buffer;


}
CloseHandle(hCOM);
}
В качестве параметра ставлю ALL ошибки нет, ну и вообще ничего не сообщает, в buffer хранится команда, если отправляю с параметром REC UNREAD выдает ERROR. Может отправку команды то же в цикл засунуть?
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
1) strcpy(buffer,"AT+CMGF=1\r");
2) WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); не sizeof(buffer) а длину текста (10 в предыдущей строке)
290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Цитата: arrjj
1) strcpy(buffer,"AT+CMGF=1\r");
2) WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); не sizeof(buffer) а длину текста (10 в предыдущей строке)



Ошибки нет возвращяет только AT+CMGL="REC UNREAD". Нету СМС, новое отправляю результата нет.

277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
Код:
Memo1->Text="";
while(1)//в итоге нужно сделать так псевдокод: while( ! buffer.Заканчивается_на("OK\r\r") || !buffer.Заканчивается_на("ERROR\r\r") || таймаут)
{
memset(buffer,0,sizeof(buffer));
  ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
if(nb>1)
{
  ShowMessage(buffer);
  Memo1->Text+=buffer;
}

}
ориентируйся не на начало ответа а на конец
290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
В общем сделал так:

Код:
HANDLE hCOM=CreateFile(Edit1->Text.c_str()
,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hCOM!=INVALID_HANDLE_VALUE)
{

DWORD nb;
OVERLAPPED ov;
char buffer[30];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"AT+CMGF=1\r");
WriteFile(hCOM,buffer,10,&nb,&ov);

strcpy(buffer,"AT+CMGL=\"ALL\"\r");
WriteFile(hCOM,buffer,14,&nb,&ov);


Memo1->Text="";
while(!buff.Pos("OK\r")||!buff.Pos("ERROR\r") )
{

  memset(buffer,0,sizeof(buffer));
  ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
  buff=buffer;
  if(nb>1)
  {
  ShowMessage(buff);
  Memo1->Text+=buffer;
  }

}
CloseHandle(hCOM);
}
Выводит вот такое ^RSSI:12 при чем только такие сообщения.
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
Код:
HANDLE hCOM=CreateFile(Edit1->Text.c_str()
,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hCOM!=INVALID_HANDLE_VALUE)
{

DWORD nb;
OVERLAPPED ov;
char buffer[30];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"AT+CMGF=1\r");
WriteFile(hCOM,buffer,10,&nb,&ov);

//отключение периодической индикации состояния сети

strcpy(buffer,"AT^CURC=0\r");
WriteFile(hCOM,buffer,10,&nb,&ov);

while(1)
{
strcpy(buffer,"AT+CMGL=\"ALL\"\r");
WriteFile(hCOM,buffer,14,&nb,&ov);


Memo1->Text="";
while(!buff.Pos("OK\r")||!buff.Pos("ERROR\r") )
{

  memset(buffer,0,sizeof(buffer));
  ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
  buff=buffer;
  if(nb>1)
  {
  ShowMessage(buff);
  Memo1->Text+=buffer;
  }
}
}
CloseHandle(hCOM);
}
так сделай
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
ну вобще тут еще нужно учесть что с предыдущих комманд останутся ответы (OK,OK)
290
06 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Не не хочет, то же самое все, и кстати индикацию не вырубает.
277
06 февраля 2013 года
arrjj
1.7K / / 26.01.2011
Ну а в putty ты пробовал?
Проверка PIN включена?
290
07 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Разобрался с Putty, только что с текстом сообщения почему цифры, как сделать текст??

Почему тогда в программе не работает?
290
07 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Ура! Получилось, как преобразовать текст сообщений????

Получаю в мемо такой ответ:
AT+CMGL="ALL"



+CMGL: 0,"REC READ","+79221874773",,"13/02/07,00:
03:53+24"
04100431043E043D0435043D04420020002B003
700390032003200310038003700340037003700330020043F0
440043E044104380442002004120430044100200435043C044
30020043F04350440043504370432043E043D04380442044C0
02E

OK

Рабочий код получения:

Код:
HANDLE hCOM=CreateFile(Form1->Edit1->Text.c_str()
,GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
if (hCOM!=INVALID_HANDLE_VALUE)
{

DWORD nb;
OVERLAPPED ov;
char buffer[50];
memset(buffer,0,sizeof(buffer));
strcpy(buffer,"AT+CMGF=1\r");
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);

//отключение периодической индикации состояния сети

//strcpy(buffer,"AT^CURC=0");
//WriteFile(hCOM,buffer,10,&nb,&ov);

while(5)
{

                                 /*AT+CMGF=1
                                 AT+CMGL="ALL" */



strcpy(buffer,"AT+CMGL=\"ALL\" ");

WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);


Form1->Memo1->Text="";
while(!buff.Pos("OK\r\r")||!buff.Pos("ERROR\r\r") )
{
  strcpy(buffer,"AT+CMGL=\"ALL\"\r");
  WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
  Sleep(500);
  memset(buffer,0,sizeof(buffer));
  ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
  buff=buffer;
  //if(nb>1)
  //{
  //ShowMessage(buff);
  Form1->Memo1->Lines->Add(buffer);

  //}
}


}

CloseHandle(hCOM);
}
else
 {
     ShowMessage("not connect!");
 }
277
07 февраля 2013 года
arrjj
1.7K / / 26.01.2011
Поэтому я текстовый режим не использовал, читал в PDU.
1) Если смс до 160 символов на английском то текст будет выведен вот так - "Short message"
2) (Твой пример) Если текст содержит другие символы, он будет выведен в hex UTF16BE - 041A043E0440043E0442043A043E043500200441043E043E043104490435043D04380435
3) Я хз как будет выведен текст длинных сообщений, которые не влезают в одну смс
4) Я хз как будет выведено содержимое сообщений, содержащих не только текст
290
07 февраля 2013 года
Patr1ot
458 / / 09.02.2008
У меня в сообщениях будут только цифры, они будут корректно отображаться? Пока не могу проверить
290
07 февраля 2013 года
Patr1ot
458 / / 09.02.2008
Не поломается, у меня фильтрация будет на смс для определенных номеров, главное чтобы цифры корректно отображались.
Спасибо, за помощь. Не так уж это и сложно как кажется на первый взгляд)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог