Обсуждение:Настольная книга по Linux/Вопросы по программной отправке SMS

В принципе, в работе с режимом PDU нет ничего экстраординарного :)

1) AT+CSCA? // узнаем номер сервис-центра
2) AT+CMGF=0 // меняем режим работы модема/телефона на PDU
3) AT+CMEE=1 // разрешает вывод кодов ошибок при неудачной отправке, а не просто сообщения ERROR
4) AT+CMGS=+IntToStr(2+length(GetPhonePDU(ePhone.Text))+length(textstr)*2)+#13

разберем по частям

  а) AT+CMGS= // команда отправки сообщения
  б) IntToStr(2+length(GetPhonePDU(ePhone.Text))+length(textstr)*2) // длинна всего сообщения (включая номер телефона, куда будет отправляться сообщение)
  в) +#13 // символ перевода строки
5) 003100+IntToHex(length(GetPhonePDU(ePhone.Text)), 2)+'91'+GetPhonePDU(ePhone.Text)+'0008AA'+IntToHex(length(textstr)*2, 2)+InUnicode(textstr)+^Z
  а) 003100 // если сообщение одно (не длинное сообщение)
     - 005100 // если это первое из серии длинных сообщений
     - 007100 // если это второе, третье, четвертое и т.д. из серии длинных сообщений
  б) IntToHex(length(GetPhonePDU(ePhone.Text)), 2) // длинна номера телефона в шестандатиричной системе счисления
  в) 91 // хз че такое, забыл уже )
  г) GetPhonePDU(ePhone.Text) // вырезка из паскаля:
     function TForm1.GetPhonePDU(InStr: String): AnsiString;
     var i: Integer;
     begin
        i:=1;
        Result:=;
        if InStr[1]='+' then InStr:=copy(InStr, 2, length(InStr)-1);
        if InStr[1]<>'3' then InStr:='3'+InStr;
        // Для преобразования номера телефона достаточно переставить местами каждые два байта
        // если кол-во цифр в телефоне не кратно 2-м, то перед последней цифрой добавляем F
        while i<=length(InStr) do begin
           if (Length(InStr)-i=0) then Result:=Result+'F'+InStr[i]
           else Result:=Result+InStr[i+1]+InStr[i];
           i:=i+2;
        end;
     end;
  д) 0008AA // тоже уже непомню что это такое
  е) IntToHex(length(textstr)*2 // длинна текстового сообщения (т.к. каждый символ занимает 2 байта, то умножаем на 2)
  ж) InUnicode(textstr) // вырезка из паскаля:
     function TForm1.InUnicode(InStr: String): AnsiString;
     var i: Integer;
     begin
        i:=1;
        Result:=;
        while i<=length(InStr) do begin
           if InStr[i] in ['А'..'Я'] then Result:=Result+(IntToHex(1040+ord(instr[i])-ord('А'), 4));
           if InStr[i] in ['а'..'я'] then Result:=Result+(IntToHex(1072+ord(instr[i])-ord('а'), 4));
           if (not (InStr[i] in ['А'..'Я'])) and (not (InStr[i] in ['а'..'я'])) then Result:=Result+IntToHex(ord(instr[i]), 4);
           i:=i+1;
        end;
     end;
     // фактичеси это перевод символов в UTF8, но т.к. такой функции в делфе я ненашел, то вот таким вот образом это все переделал.
  з) ^Z // символ конца сообщения (Ctrl+Z)

В общем, по этому способу довольно легко писать сообщения. Конечно не руками командами через гипер терминал, но все же если кому-то это поможет - буду очень рад. С вопросами можете писать на saenkoiv@mail.ru

ЗЫ: если будешь в начале отправлять ATZ, то существующий звонок будет сбрасываться. Если будешь отправлять без инициализации, то СМС может уйти даже не обрывая разговор.

Вернуться на страницу «Настольная книга по Linux/Вопросы по программной отправке SMS».