Отправка SMS в PDU формате
Следующий код отправляет СМС в кириллице, но не весь. Примерно чуть больше половины текста. Подскажите, где ошибка.
function PhoneNumberToPDU(const PhoneNumber: String): string;
var
I: Integer;
TempStr: string;
begin
TempStr := PhoneNumber;
if TempStr[1] = '+' then
Delete(TempStr, 1, 1);
Result := '';
// Если длина номера нечетная, добавить 'F' в конец
if Odd(Length(TempStr)) then
TempStr := TempStr + 'F';
// Поменять местами каждую пару цифр
for I := 1 to Length(TempStr) do
if Odd(I) then
Result := Result + TempStr[I + 1] + TempStr[I];
end;
function EncodeText(const Text: string): string;
var
I: Integer;
begin
Result := '';
for I := 1 to Length(Text) do
Result := Result + IntToHex(Ord(Text[I]), 4);
end;
procedure TfrmMain.btnSendDPUClick(Sender: TObject);
var
PDU, EncodedPhoneNumber, EncodedMessage: string;
PhoneNumber, MessageText: WideString;
AStr: AnsiString;
begin
PhoneNumber := '+**************';
MessageText := 'Пожалуйста, оплатите задолженность в размере ....';
EncodedPhoneNumber := PhoneNumberToPDU(PhoneNumber);
EncodedMessage := EncodeText(MessageText);
PDU := '0011000C91' + EncodedPhoneNumber + '00080B' + IntToHex((Length(MessageText)), 2) + EncodedMessage;
Memo1.Lines.Add(PDU);
AStr := 'AT+CMGF=0'+ #13#10;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := 'AT+CMGS=' + IntToStr((Length(PDU) div 2)-1) + #13#10;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := PDU;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(250);
AStr := ''+#26;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(100);
end;
Ответы (1 шт):
Автор решения: syteser
→ Ссылка
Помогла следующая правка:
procedure TfrmMain.btnSendDPUClick(Sender: TObject);
var
PDU, EncodedPhoneNumber, EncodedMessage: string;
PhoneNumber, MessageText: WideString;
AStr: AnsiString;
begin
PhoneNumber := '+**************';
MessageText := 'Пожалуйста, оплатите задолженность в размере ....';
EncodedPhoneNumber := PhoneNumberToPDU(PhoneNumber);
EncodedMessage := EncodeText(MessageText);
//PDU := '0011000C91' + EncodedPhoneNumber + '00080B' + IntToHex((Length(MessageText)), 2) + EncodedMessage;
PDU := '0011000C91' + EncodedPhoneNumber + '00080B' + IntToHex((Length(MessageText)*2+6), 2) + EncodedMessage; //измененная строка
Memo1.Lines.Add(PDU);
AStr := 'AT+CMGF=0'+ #13#10;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := 'AT+CMGS=' + IntToStr((Length(PDU) div 2)-1) + #13#10;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := PDU;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(250);
AStr := ''+#26;
BCPort1.Write(AStr[1], Length(AStr));
Sleep(100);
end;