Получение СМС
Собственно сабж, нужно получать СМС из 3g модема модель: Е1550. Как это реализовать? Даже не знаю с чего начать.
А вообще мне нужно что бы я мог получать все входящие смс на любой номер, в текстовом файле. Спрашивал в СМС сервисах, смогут ли они предоставить такую возможность. Дороговато. Может есть другие еще лучше бесплатные сервисы?)
Придет спам от оператора - все поломается нафиг
пишешь в него 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
Код:
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);
}
,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);
}
а тут читаешь ответ на комманду, пока не прочтешь OK или ERROR
CloseHandle(hCOM);
Цитата: arrjj
WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
а тут читаешь ответ на комманду, пока не прочтешь OK или ERROR
CloseHandle(hCOM);
а тут читаешь ответ на комманду, пока не прочтешь OK или ERROR
CloseHandle(hCOM);
А как ее читать?
ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov); ??? и проверять содержимое?
while(buffer!="AT+CMGL")
{
ReadFile(hCOM,buffer,sizeof(buffer),&nb,&ov);
Memo1->Text=buffer;
break;
}
Получаю только:
OK
L
А как мне получить инфу сообщния?
а ты на него смс отправь чтоб непрочитанным висело
Цитата: 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);
}
,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);
}
2) WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); не sizeof(buffer) а длину текста (10 в предыдущей строке)
Цитата: arrjj
1) strcpy(buffer,"AT+CMGF=1\r");
2) WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); не sizeof(buffer) а длину текста (10 в предыдущей строке)
2) WriteFile(hCOM,buffer,sizeof(buffer),&nb,&ov); не sizeof(buffer) а длину текста (10 в предыдущей строке)
Ошибки нет возвращяет только AT+CMGL="REC UNREAD". Нету СМС, новое отправляю результата нет.
Код:
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;
}
}
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;
}
}
Код:
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);
}
,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);
}
Код:
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);
}
,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);
}
ну вобще тут еще нужно учесть что с предыдущих комманд останутся ответы (OK,OK)
Не не хочет, то же самое все, и кстати индикацию не вырубает.
Проверка PIN включена?
Разобрался с Putty, только что с текстом сообщения почему цифры, как сделать текст??
Получаю в мемо такой ответ:
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!");
}
,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!");
}
1) Если смс до 160 символов на английском то текст будет выведен вот так - "Short message"
2) (Твой пример) Если текст содержит другие символы, он будет выведен в hex UTF16BE - 041A043E0440043E0442043A043E043500200441043E043E043104490435043D04380435
3) Я хз как будет выведен текст длинных сообщений, которые не влезают в одну смс
4) Я хз как будет выведено содержимое сообщений, содержащих не только текст
У меня в сообщениях будут только цифры, они будут корректно отображаться? Пока не могу проверить
Спасибо, за помощь. Не так уж это и сложно как кажется на первый взгляд)