формат AT-команды для мобильника

Тема в разделе "WASM.ELECTRONICS", создана пользователем miZantrop, 29 ноя 2006.

  1. miZantrop

    miZantrop New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    5
    Подскажите пожалуйста, если кто знает, в каком виде должны посылаться АТ-команды на мобильник (или хотя бы на любой модем). Конкретнее: есть контроллер и мобильник. Задача заставить контроллер управлять телефоном по программе. Есть список АТ-команд, поддерживаемых этим конкретным телефоном. С компьютера, написанием в командной строке, всё получается. Вопрос в том, какой конкретно код соответствует, например букве "А". А то везде подробно описывается работа с командами, но нигде не описан их формат. Подразумевается, что компьютер это сам знает. Но контроллер то не знает.
     
  2. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    'A' = 0x41 = 65 :)
     
  3. miZantrop

    miZantrop New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    5
    То есть обычная ASCII? Или там у них какой то свой хитрый формат?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Обычная. В некоторых прогах для работы с мобилками есть окошко терминала или лог - там всё расписано.
     
  5. SL555

    SL555 New Member

    Публикаций:
    0
    Регистрация:
    8 ноя 2006
    Сообщения:
    16
    Вот пример работы только с GSM модемом
    Код (Text):
    1. CGsmModem::CGsmModem(){
    2.  
    3.     memset(Name_Operator,0,sizeof(Name_Operator));
    4.     memset(AT_Beeline,0,sizeof(AT_Beeline));
    5.     memset(AT_MTS,0,sizeof(AT_MTS));
    6.     memset(AT_Megafone,0,sizeof(AT_Megafone));
    7.     memset(AT_GetOperator,0,sizeof(AT_GetOperator));
    8.     memset(AT_StatusRadio,0,sizeof(AT_StatusRadio));
    9.  
    10.     Drob_Balance=0;
    11.     Int_Balance=0;
    12.     Chet=0.0;
    13.  
    14.     Code_Operators=0;
    15.    
    16.     sprintf(AT_Beeline,"%s,\"%s\"\r","AT+CUSD=1","*102#");
    17.     sprintf(AT_MTS,"%s,\"%s\"\r","AT+CUSD=1","*100#");
    18.     sprintf(AT_Megafone,"%s,\"%s\"\r","AT+CUSD=1","*100#");
    19. //  sprintf(AT_GetOperator,"%s\r","AT+CPHS=2,5");
    20.     sprintf(AT_GetOperator,"%s\r","AT+COPS?");
    21. //   sprintf(AT_GetOperator,"%s\r","AT+WOPN=0,20801");
    22.     sprintf(AT_StatusRadio,"%s\r","AT+CSQ");
    23.  
    24. }
    25.  
    26. int CGsmModem::Get_Status_Radio(void){
    27.      char Buf[256];
    28.      char Log_buf[1024];
    29.      DWORD Error;
    30.      memset(Log_buf,0,sizeof(Log_buf));
    31.      memset(Buf,0,sizeof(Buf));
    32.  
    33.      if(ComPort2.Open(_T("\\\\.\\COM2"))==false){
    34.       Error=GetLastError();
    35.       sprintf(Log_buf,"Неудалось открыть порт  ошибка - %d",Error);
    36.       Add_Log_File(Log_buf);
    37.       return -1;
    38.      }
    39.      ComPort2.SetEventMask(EV_RXCHAR);
    40.      
    41.      if(ComPort2.WriteBytes((BYTE*)AT_StatusRadio,(DWORD)strlen(AT_StatusRadio),50)==false){
    42.       Error=GetLastError();
    43.       sprintf(Log_buf,"Неудалось записать в порт  ошибка - %d",Error);
    44.       Add_Log_File(Log_buf);
    45.       ComPort2.Close();
    46.       return -1;
    47.      }else{
    48.       sprintf(Log_buf,"Команда модему - %s",AT_StatusRadio);
    49.       Add_Log_File(Log_buf);
    50.      }
    51.      if(ComPort2.ReadBytes((BYTE*)Buf,50,50)==false){
    52.       Error=GetLastError();
    53.       if(Error!=0){
    54.       sprintf(Log_buf,"Неудалось прочитать из порта  ошибка - %d",Error);
    55.       Add_Log_File(Log_buf);
    56.       ComPort2.Close();
    57.       return -1;
    58.       }
    59.      }
    60.       sprintf(Log_buf,"Ответ модема - %s",Buf);
    61.       Add_Log_File(Log_buf);
    62.  
    63.      if(Find_OK(Buf,255)==0){
    64.          ComPort2.FlushBuffer();
    65.       sprintf(Log_buf,"%s","Ошибочный ответ модема" );
    66.       Add_Log_File(Log_buf);
    67.       ComPort2.Close();
    68.       return -1;
    69.      }/*else{
    70.      AfxMessageBox("OK");
    71.      }*/
    72.  
    73.    int s=Find_Status_Radio(Buf,255);
    74.    sprintf(Log_buf,"Статус связи - %d",s);
    75.    Add_Log_File(Log_buf);
    76.    ComPort2.Close();
    77.    return s;
    78. }
    79.  
    80.  
    81.  
    82. int CGsmModem::Get_Operator(void){
    83.      char Buf[256];
    84.      char Log_buf[1024];
    85.      DWORD Error;
    86.      memset(Log_buf,0,sizeof(Log_buf));
    87.      memset(Buf,0,sizeof(Buf));
    88.  
    89.      if(ComPort2.Open(_T("\\\\.\\COM2"))==false){
    90.       Error=GetLastError();
    91.       sprintf(Log_buf,"Неудалось открыть порт  ошибка - %d",Error);
    92.       Add_Log_File(Log_buf);
    93.       return -1;
    94.      }
    95.      ComPort2.SetEventMask(EV_RXCHAR);
    96.     /*BYTE AT[50];
    97.     memset(AT,0,sizeof(AT));
    98.     sprintf((char*)AT,"%s\r","AT+CPHS=2,5");*/
    99.      if(ComPort2.WriteBytes((BYTE*)AT_GetOperator,(DWORD)strlen(AT_GetOperator),50)==false){
    100.       Error=GetLastError();
    101.       sprintf(Log_buf,"Неудалось записать в порт  ошибка - %d",Error);
    102.       Add_Log_File(Log_buf);
    103.       ComPort2.Close();
    104.       return -1;
    105.      }else{
    106.       sprintf(Log_buf,"Команда модему - %s",AT_GetOperator);
    107.       Add_Log_File(Log_buf);
    108.      }
    109.      if(ComPort2.ReadBytes((BYTE*)Buf,50,50)==false){
    110.       Error=GetLastError();
    111.       if(Error!=0){
    112.       sprintf(Log_buf,"Неудалось прочитать из порта  ошибка - %d",Error);
    113.       Add_Log_File(Log_buf);
    114.       ComPort2.Close();
    115.       return -1;
    116.       }
    117.      }
    118.     // AfxMessageBox(Buf);
    119.       sprintf(Log_buf,"Ответ модема - %s",Buf);
    120.       Add_Log_File(Log_buf);
    121. //   }
    122.      if(Find_OK(Buf,255)==0){
    123.       ComPort2.FlushBuffer();
    124.       sprintf(Log_buf,"%s","Ошибочный ответ модема" );
    125.       Add_Log_File(Log_buf);
    126.       ComPort2.Close();
    127.       return -1;
    128.      }/*else{
    129.      AfxMessageBox("OK");
    130.      }*/
    131.  
    132.    
    133.    Find_Name_Operator2( Buf,255);
    134.    sprintf(Log_buf,"Текуший оператор - %s",Name_Operator);
    135.    Add_Log_File(Log_buf);
    136.    ComPort2.Close();
    137.    if(Code_Operators==0)
    138.        return -1;
    139.  return 1;
    140. }
    141.  
    142. int  CGsmModem::Get_Balance(void){
    143.      char Buf[500];
    144.      char Log_buf[1024];
    145.      char AT_USSD[50];
    146.      DWORD Error;
    147.      memset(Log_buf,0,sizeof(Log_buf));
    148.      memset(Buf,0,sizeof(Buf));
    149.      memset(AT_USSD,0,sizeof(AT_USSD));
    150.  
    151.      switch(Code_Operators){
    152.      case 0:
    153.          return -2;
    154.          break;
    155.      case 1:
    156.          sprintf(AT_USSD,"%s",AT_Beeline);
    157.          break;
    158.      case 2:
    159.          sprintf(AT_USSD,"%s",AT_MTS);
    160.          break;
    161.      case 3:
    162.          sprintf(AT_USSD,"%s",AT_Megafone);
    163.          break;
    164.      }
    165.  
    166.      if(ComPort2.Open(_T("\\\\.\\COM2"))==false){
    167.       Error=GetLastError();
    168.       sprintf(Log_buf,"Неудалось открыть порт  ошибка - %d",Error);
    169.       Add_Log_File(Log_buf);
    170.       return -1;
    171.      }
    172.      ComPort2.SetEventMask(EV_RXCHAR);
    173.  if(ComPort2.WriteBytes((BYTE*)AT_USSD,(DWORD)strlen(AT_USSD),50)==false){
    174.       Error=GetLastError();
    175.       sprintf(Log_buf,"Неудалось записать в порт  ошибка - %d",Error);
    176.       Add_Log_File(Log_buf);
    177.       ComPort2.Close();
    178.       return -1;
    179.      }else{
    180.       sprintf(Log_buf,"Команда модему - %s",AT_USSD);
    181.       Add_Log_File(Log_buf);
    182.      }
    183.  
    184.      if(ComPort2.ReadBytes((BYTE*)Buf,50,50)==false){
    185.       Error=GetLastError();
    186.       if(Error!=0){
    187.       sprintf(Log_buf,"Неудалось прочитать из порта  ошибка - %d",Error);
    188.       Add_Log_File(Log_buf);
    189.       ComPort2.FlushBuffer();
    190.       ComPort2.Close();
    191.       return -1;
    192.       }
    193.      }
    194.    
    195.      // AfxMessageBox(Buf);
    196.       Sleep(2000);
    197.   if(Find_OK(Buf,255)==0){
    198.     ComPort2.FlushBuffer();
    199.       sprintf(Log_buf,"%s","Ошибочный ответ модема" );
    200.       Add_Log_File(Log_buf);
    201.       ComPort2.Close();
    202.       return -1;
    203.      }/*else{
    204.      AfxMessageBox("OK");
    205.      }*/
    206.       sprintf(Log_buf,"Ответ модема - %s",Buf);
    207.        Add_Log_File(Log_buf);
    208.         Sleep(3000);
    209.      memset(Buf,0,sizeof(Buf));
    210.  
    211.      if(ComPort2.ReadBytes((BYTE*)Buf,500,50)==false){
    212.       Error=GetLastError();
    213.        if(Error!=0){
    214.         sprintf(Log_buf,"Неудалось прочитать из порта  ошибка - %d",Error);
    215.         Add_Log_File(Log_buf);
    216.         ComPort2.Close();
    217.       return -1;
    218.       }
    219.      }
    220.  
    221.  
    222.     // AfxMessageBox(Buf);
    223.       sprintf(Log_buf,"Ответ модема - %s",Buf);
    224.       Add_Log_File(Log_buf);
    225.  
    226.    
    227. Find_Summ(Buf,255);
    228. Chet=(double)Int_Balance+0.01*(double)Drob_Balance;
    229. sprintf(Log_buf,"Сумма на счете - %f",Chet);
    230. Add_Log_File(Log_buf);
    231. ComPort2.Close();
    232.  return 1;
    233. }
     
  6. uni

    uni New Member

    Публикаций:
    0
    Регистрация:
    23 май 2005
    Сообщения:
    67
    А какой мобильник и какой мк? Можно было на пару поработать. Две головы лучше. Давно хотел что-то в этом роде наваять, есть сименс AX75 (пишут, что модем (думаю, что GSM) и COM порт есть) и простой какой контроллёр AVR.
     
  7. miZantrop

    miZantrop New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    5
    Большое спасибо за пример.
    Мобильник Nokia 2600, конроллер, АТ89С51. Задача - сделать недорогое устроиство сигнализации гаража. Знакомый предложил попробовать, предоставил старый телефон и мк. И ему хорошо и мне бесценный опыт.
     
  8. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    IMHO, с мобильником лучше всего работать в PDU-mode. Кроме того, отсылка сообщений двухфазная - после инициализации записи необходимо дожидаться ответа от GSM-modem'a: '>', и только после этого отсылать остаток сообщения. Стандарты несколько невнятны, рекомедую посмотреть доки на сайте Сименса (M-20 etc) у них самая подробная документация - при вдумчивом прочтении этого должно хватить.
     
  9. miZantrop

    miZantrop New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    5
    А где почитать про механизм этого PDU и с чем его едят? Всё таки с контроллера всё вручную делать придётся.
     
  10. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Если не хватит документации Сименса - см. сами стандарты + как обычно, гугль. В сети полно пошаговых примеров.

    Из того, что под рукой (не только 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
     
  11. miZantrop

    miZantrop New Member

    Публикаций:
    0
    Регистрация:
    29 ноя 2006
    Сообщения:
    5
    Спасибо.