Обсуждение:Настольная книга по 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»
На страницах обсуждения люди обсуждают, как улучшить содержимое Викиучебника. Вы можете использовать эту страницу, чтобы обсудить с другими участниками, какие улучшения внести на страницу «Настольная книга по Linux/Вопросы по программной отправке SMS».