Подскажите пожалуйста, если кто знает, в каком виде должны посылаться АТ-команды на мобильник (или хотя бы на любой модем). Конкретнее: есть контроллер и мобильник. Задача заставить контроллер управлять телефоном по программе. Есть список АТ-команд, поддерживаемых этим конкретным телефоном. С компьютера, написанием в командной строке, всё получается. Вопрос в том, какой конкретно код соответствует, например букве "А". А то везде подробно описывается работа с командами, но нигде не описан их формат. Подразумевается, что компьютер это сам знает. Но контроллер то не знает.
Обычная. В некоторых прогах для работы с мобилками есть окошко терминала или лог - там всё расписано.
Вот пример работы только с GSM модемом Код (Text): CGsmModem::CGsmModem(){ memset(Name_Operator,0,sizeof(Name_Operator)); memset(AT_Beeline,0,sizeof(AT_Beeline)); memset(AT_MTS,0,sizeof(AT_MTS)); memset(AT_Megafone,0,sizeof(AT_Megafone)); memset(AT_GetOperator,0,sizeof(AT_GetOperator)); memset(AT_StatusRadio,0,sizeof(AT_StatusRadio)); Drob_Balance=0; Int_Balance=0; Chet=0.0; Code_Operators=0; sprintf(AT_Beeline,"%s,\"%s\"\r","AT+CUSD=1","*102#"); sprintf(AT_MTS,"%s,\"%s\"\r","AT+CUSD=1","*100#"); sprintf(AT_Megafone,"%s,\"%s\"\r","AT+CUSD=1","*100#"); // sprintf(AT_GetOperator,"%s\r","AT+CPHS=2,5"); sprintf(AT_GetOperator,"%s\r","AT+COPS?"); // sprintf(AT_GetOperator,"%s\r","AT+WOPN=0,20801"); sprintf(AT_StatusRadio,"%s\r","AT+CSQ"); } int CGsmModem::Get_Status_Radio(void){ char Buf[256]; char Log_buf[1024]; DWORD Error; memset(Log_buf,0,sizeof(Log_buf)); memset(Buf,0,sizeof(Buf)); if(ComPort2.Open(_T("\\\\.\\COM2"))==false){ Error=GetLastError(); sprintf(Log_buf,"Неудалось открыть порт ошибка - %d",Error); Add_Log_File(Log_buf); return -1; } ComPort2.SetEventMask(EV_RXCHAR); if(ComPort2.WriteBytes((BYTE*)AT_StatusRadio,(DWORD)strlen(AT_StatusRadio),50)==false){ Error=GetLastError(); sprintf(Log_buf,"Неудалось записать в порт ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.Close(); return -1; }else{ sprintf(Log_buf,"Команда модему - %s",AT_StatusRadio); Add_Log_File(Log_buf); } if(ComPort2.ReadBytes((BYTE*)Buf,50,50)==false){ Error=GetLastError(); if(Error!=0){ sprintf(Log_buf,"Неудалось прочитать из порта ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.Close(); return -1; } } sprintf(Log_buf,"Ответ модема - %s",Buf); Add_Log_File(Log_buf); if(Find_OK(Buf,255)==0){ ComPort2.FlushBuffer(); sprintf(Log_buf,"%s","Ошибочный ответ модема" ); Add_Log_File(Log_buf); ComPort2.Close(); return -1; }/*else{ AfxMessageBox("OK"); }*/ int s=Find_Status_Radio(Buf,255); sprintf(Log_buf,"Статус связи - %d",s); Add_Log_File(Log_buf); ComPort2.Close(); return s; } int CGsmModem::Get_Operator(void){ char Buf[256]; char Log_buf[1024]; DWORD Error; memset(Log_buf,0,sizeof(Log_buf)); memset(Buf,0,sizeof(Buf)); if(ComPort2.Open(_T("\\\\.\\COM2"))==false){ Error=GetLastError(); sprintf(Log_buf,"Неудалось открыть порт ошибка - %d",Error); Add_Log_File(Log_buf); return -1; } ComPort2.SetEventMask(EV_RXCHAR); /*BYTE AT[50]; memset(AT,0,sizeof(AT)); sprintf((char*)AT,"%s\r","AT+CPHS=2,5");*/ if(ComPort2.WriteBytes((BYTE*)AT_GetOperator,(DWORD)strlen(AT_GetOperator),50)==false){ Error=GetLastError(); sprintf(Log_buf,"Неудалось записать в порт ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.Close(); return -1; }else{ sprintf(Log_buf,"Команда модему - %s",AT_GetOperator); Add_Log_File(Log_buf); } if(ComPort2.ReadBytes((BYTE*)Buf,50,50)==false){ Error=GetLastError(); if(Error!=0){ sprintf(Log_buf,"Неудалось прочитать из порта ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.Close(); return -1; } } // AfxMessageBox(Buf); sprintf(Log_buf,"Ответ модема - %s",Buf); Add_Log_File(Log_buf); // } if(Find_OK(Buf,255)==0){ ComPort2.FlushBuffer(); sprintf(Log_buf,"%s","Ошибочный ответ модема" ); Add_Log_File(Log_buf); ComPort2.Close(); return -1; }/*else{ AfxMessageBox("OK"); }*/ Find_Name_Operator2( Buf,255); sprintf(Log_buf,"Текуший оператор - %s",Name_Operator); Add_Log_File(Log_buf); ComPort2.Close(); if(Code_Operators==0) return -1; return 1; } int CGsmModem::Get_Balance(void){ char Buf[500]; char Log_buf[1024]; char AT_USSD[50]; DWORD Error; memset(Log_buf,0,sizeof(Log_buf)); memset(Buf,0,sizeof(Buf)); memset(AT_USSD,0,sizeof(AT_USSD)); switch(Code_Operators){ case 0: return -2; break; case 1: sprintf(AT_USSD,"%s",AT_Beeline); break; case 2: sprintf(AT_USSD,"%s",AT_MTS); break; case 3: sprintf(AT_USSD,"%s",AT_Megafone); break; } if(ComPort2.Open(_T("\\\\.\\COM2"))==false){ Error=GetLastError(); sprintf(Log_buf,"Неудалось открыть порт ошибка - %d",Error); Add_Log_File(Log_buf); return -1; } ComPort2.SetEventMask(EV_RXCHAR); if(ComPort2.WriteBytes((BYTE*)AT_USSD,(DWORD)strlen(AT_USSD),50)==false){ Error=GetLastError(); sprintf(Log_buf,"Неудалось записать в порт ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.Close(); return -1; }else{ sprintf(Log_buf,"Команда модему - %s",AT_USSD); Add_Log_File(Log_buf); } if(ComPort2.ReadBytes((BYTE*)Buf,50,50)==false){ Error=GetLastError(); if(Error!=0){ sprintf(Log_buf,"Неудалось прочитать из порта ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.FlushBuffer(); ComPort2.Close(); return -1; } } // AfxMessageBox(Buf); Sleep(2000); if(Find_OK(Buf,255)==0){ ComPort2.FlushBuffer(); sprintf(Log_buf,"%s","Ошибочный ответ модема" ); Add_Log_File(Log_buf); ComPort2.Close(); return -1; }/*else{ AfxMessageBox("OK"); }*/ sprintf(Log_buf,"Ответ модема - %s",Buf); Add_Log_File(Log_buf); Sleep(3000); memset(Buf,0,sizeof(Buf)); if(ComPort2.ReadBytes((BYTE*)Buf,500,50)==false){ Error=GetLastError(); if(Error!=0){ sprintf(Log_buf,"Неудалось прочитать из порта ошибка - %d",Error); Add_Log_File(Log_buf); ComPort2.Close(); return -1; } } // AfxMessageBox(Buf); sprintf(Log_buf,"Ответ модема - %s",Buf); Add_Log_File(Log_buf); Find_Summ(Buf,255); Chet=(double)Int_Balance+0.01*(double)Drob_Balance; sprintf(Log_buf,"Сумма на счете - %f",Chet); Add_Log_File(Log_buf); ComPort2.Close(); return 1; }
А какой мобильник и какой мк? Можно было на пару поработать. Две головы лучше. Давно хотел что-то в этом роде наваять, есть сименс AX75 (пишут, что модем (думаю, что GSM) и COM порт есть) и простой какой контроллёр AVR.
Большое спасибо за пример. Мобильник Nokia 2600, конроллер, АТ89С51. Задача - сделать недорогое устроиство сигнализации гаража. Знакомый предложил попробовать, предоставил старый телефон и мк. И ему хорошо и мне бесценный опыт.
IMHO, с мобильником лучше всего работать в PDU-mode. Кроме того, отсылка сообщений двухфазная - после инициализации записи необходимо дожидаться ответа от GSM-modem'a: '>', и только после этого отсылать остаток сообщения. Стандарты несколько невнятны, рекомедую посмотреть доки на сайте Сименса (M-20 etc) у них самая подробная документация - при вдумчивом прочтении этого должно хватить.
А где почитать про механизм этого PDU и с чем его едят? Всё таки с контроллера всё вручную делать придётся.
Если не хватит документации Сименса - см. сами стандарты + как обычно, гугль. В сети полно пошаговых примеров. Из того, что под рукой (не только PDU): h**p://w*w.alystel.kz/Catalog.old/siemens/cell_system/m20_sms.pdf h**p://clubpro.spb.ru/ubb/Forum13/HTML/000015.html h**p://w*w.smsitaly.com/Download/ETSI_GSM_03.38.pdf h**p://w*w.mobilecity.cz/doc/GSM_03.40_5.3.0.pdf h**p://w*w.informatik.hu-berlin.de/~holz/Vorlesung/HS/ETSI_705v500.pdf h**p://w*w.3gpp.org/ftp/tsg_t/WG2_Capability/TSGT2_05/Docs/T2-99678.pdf h**p://w*w.dreamfabric.com/sms/default_alphabet.html h**p://w*w.nobbi.com/sms_pdu.htm h**p://w*w.gsm-modem.de/ucs2.html Еще полезно при отладке h**p://w*w.nobbi.com/download/pduspy.zip