отправка СМС с русскими символами
Есть 3G модем Hyawei E153 с родной прошивкой и драйверами. Windows 11. Delphi 10.3 Компонент TBComPort ver.2.20.
Следующий код без проблем отправляет СМС с латиницей:
procedure sendSMS(const phoneNumber, messageText: WideString);
var
AStr: AnsiString;
ANumber: AnsiString;
AMessage: AnsiString;
begin
ANumber := phoneNumber;
AMessage := messageText;
AStr := 'AT+CMGF=1' + #13#10;
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := 'AT+CMGS="' + ANumber + '"' + #13#10;
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := AMessage + #26;
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(500);
end;
Добавляю функцию перекодировки текста в Юникод
function EncodeUnicodeToUCS2(const s: WideString): AnsiString;
var
i: Integer;
begin
SetLength(Result, Length(s) * 2);
for i := 1 to Length(s) do
begin
Result[i * 2 - 1] := AnsiChar(Ord(s[i]) div 256);
Result[i * 2] := AnsiChar(Ord(s[i]) mod 256);
end;
end;
procedure sendSMS(const phoneNumber, messageText: WideString);
var
AStr: AnsiString;
ANumber: AnsiString;
AMessage: AnsiString;
begin
ANumber := phoneNumber;
AMessage := messageText;
AStr := 'AT+CMGF=1' + #13#10;
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := 'AT+CSCS="UCS2"' + #13#10; // Устанавливаем кодировку UCS2
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := 'AT+CMGS="' + ANumber + '"' + #13#10;
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(100);
AStr := EncodeUnicodeToUCS2(AMessage) + #26;
frmMain.BComPort1.Write(AStr[1], Length(AStr));
Sleep(500);
end;
и после этого получаем ответ модема:
AT+CMGF=1
OK
AT+CSCS="UCS2"
OK
AT+CMGS="+38050ххххххх" // номер правильный
ERROR