Обсуждение:Настольная книга по 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».