手机发短信问题求解

chinazhf 2003-12-19 11:06:06
目前我能够使用MSCOMM控件,利用手机红外线连接NOKIA8310发送短信,文本方式发送没有问题,但发送中文短信确一直不行,希望高手指点,如解决,谁有兴趣可拿源程序一起研究
以下简单短信代码:
MSComm.portopen:=true;
mscomm.output:='AT+CMGF=0'+chr(13);
mscomm.output:='AT+CMGS="0891683108200005F011000D91683117417906F5000800165982679C6536523077ED4FE1002C8BF756DE590D002E"'+chr(26);

使用超级终端输入AT+CMGS命令报错,不知是否语法有问题
...全文
77 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
GameWeaver 2003-12-21
  • 打赏
  • 举报
回复
还要将字符串转换成ASCII
chinazhf 2003-12-21
  • 打赏
  • 举报
回复
使用PDU,已经转换UCS2编码,难道真的要放弃,这个问题已经围绕我一个多星期,好郁闷!!!!!!!!!!!!无奈这里的高手都解决不了,上哪去咨询,好失望!!!!!!!!!!
Jerry529 2003-12-21
  • 打赏
  • 举报
回复
//这个例子我是做来用GSM模块发送短信的,但是我没有测试过,你自己试吧
function SMSEncode(s: WideString; Result_Code: PChar): Boolean;
var
i, len, cur: Integer;
t, temp: string;
begin
if Length(s)>0 then
begin
len := Length(s);
i := 1;
while i <= len do
begin
cur := ord(s[i]);
//BCD convert
FmtStr(t, '%4.4X', [cur]);
temp := temp + t;
Inc(i);
end;
StrCopy(Result_Code, PChar(temp));
Result := True;
end
else
Result := False;
end;

function SMSDecode(Input_Code:pchar; Result_Str:pchar): Boolean;
var
str, R_String, temp: string;
i, A_integer: Integer;
A_PWideChar: array[0..300] of WideChar;
begin
str := StrPas(Input_Code);
R_String := '';
if Length(str)<=0 then
begin
Result := False;
Exit;
end;
i := 0;
while i < Length(str) do
begin
temp := Copy(str, i + 1, 4);
A_integer := StrtoInt('$' + temp);
Move(A_integer, A_PWideChar[i div 4], SizeOf(A_PWideChar[i div 4]));
Inc(i, 4);
end;
A_PWideChar[Length(str) div 4] := #0;
R_String := WideCharToString(@A_PWideChar);
StrCopy(Result_Str, PChar(R_String));
Result := True;
end;

function MakePDU(DestNumber: PChar; Content: PChar; Result_String: PChar): Boolean;
const
lenSmsInfo = '00';
firstOctet = '11';
TPMessageReference = '00';
TypeOfAddress = '91';
TpId = '00';
TpDcs = '08';//"00" is 7 bit encode "08" is 8 bit encode;
TPValidityPeriod = 'AA';//aa is 4 day
var
DestPhoneNum: string;
AddressLength: string;
TpUserData: string;
TPUserDataLength: string;
temp: WideString;
Tmp_Pchar: PChar;
Rlt_str: string;
begin
if (DestNumber='') or (Content='') then
begin
Result := False;
Exit;
end
else
begin
DestPhoneNum := ConvertPhoneNum(DestNumber);
AddressLength := Format('%2.2X', [length(DestNumber)]);
temp := Content;
Tmp_Pchar := StrAlloc(1000);

if SMSEncode(temp, Tmp_Pchar) then
TpUserData := StrPas(Tmp_Pchar);

if TpDcs='08' then
TPUserDataLength := Format('%2.2X', [Length(TpUserData) div 2])
else
TPUserDataLength := Format('%2.2X', [((Length(TpUserData) div 2)*8) div 7]);
Rlt_str := lenSmsInfo
+ firstOctet
+ TPMessageReference
+ AddressLength
+ TypeOfAddress
+ DestPhoneNum
+ TpId
+ TpDcs
+ TPValidityPeriod
+ TPUserDataLength
+ TpUserData;//TpUserData have to Encoded;
StrCopy(Result_String, PChar(Rlt_str));
Result := True;
end;
end;

function ConvertPhoneNum(strNum: string): string;
var
i:integer;
str:string;
A_Pchar:pchar;
begin
str:=strNum;
i:=length(str);
if odd(i) then
begin
str := str + 'F';
A_Pchar := StrAlloc(40);
if Transposition(pchar(str), A_pchar) then
Result := StrPas(A_Pchar)
else
Result:= 'Null';
end
else
begin
A_Pchar := StrAlloc(40);
if Transposition(PChar(str), A_pchar) then
Result := StrPas(A_Pchar)
else
Result := 'Null';
end;
end;

function Transposition(instr: PChar; Result_str: PChar): Boolean;
var
i: Integer;
temp, destStr, In_String: string;
begin
if Length(instr) > 0 then
begin
destStr := '';
In_String := StrPas(instr);
SetLength(In_String, Length(In_String));
i := 1;
while i < Length(In_String) do
begin
temp := In_String[i + 1] + In_String[i];
destStr := destStr + temp;
Inc(i, 2);
end;
StrCopy(Result_Str, PChar(destStr));
Result := True;
end
else
begin
Result := False;
end;
end;

procedure TSMSSender.SendPDUMsg;
var
iIndex: Integer;
pMsg: PChar;
sSend: string;
begin
for iIndex := 0 to FToUsers.Count - 1 do
begin
//在这里进行编码
MakePDU(PChar(FToUsers[iIndex]), PChar(FContent), PChar(sSend));
sSend := 'AT+CMGS=' + sSend + #$13;
SendSMSMsg(sSend);
end;
end;

procedure TSMSSender.SendSMSMsg(sMsg: string);
var
aComm: TComm;
begin
aComm := TComm.Create(nil);
try
aComm.DeviceName := FDevice;
aComm.BaudRate := FBaudrate;
aComm.Open;
aComm.Write(sMsg, Length(sMsg));
finally
aComm.Free;
end;
end;
chinazhf 2003-12-20
  • 打赏
  • 举报
回复
to solonet(赤岭雄鹰),请问您做过有关程序吗?
solonet 2003-12-20
  • 打赏
  • 举报
回复
输入的中文必须转成UNICODE格式,才可以的。

如果你同意,请发源码来。
solonet@163.net

qq:28972303
gencan 2003-12-19
  • 打赏
  • 举报
回复
up
pwzhu666 2003-12-19
  • 打赏
  • 举报
回复
正在找
....
nhdj 2003-12-19
  • 打赏
  • 举报
回复
不会,学习...
抱朴守拙 2003-12-19
  • 打赏
  • 举报
回复
关注中...
chinazhf 2003-12-19
  • 打赏
  • 举报
回复
to Jerry529(情兽) 兄,请问您有没有测试过啊,能否提供部分源代码,zhf@21cn.com,盼望中,谢谢!
Jerry529 2003-12-19
  • 打赏
  • 举报
回复
使用pdu格式可以啊。

at+cmgf=0 ----使用pdu模式

at+cmgf=1 ----使用text模式

但是,你首先要看nokia的手机是否支持pdu格式。

不过,我想应该是支持的。

因为text模式不支持中文短消息。

你要先查查pdu格式手册,每一个短信中心的pdu格式不是很一致的。

没有必要做什么16进制的转换啊。如果发送中文,那么用的是uc2码。

比如说发送给手机号码为123456789ab的手机发送1234。那么pdu格式应该是

0891683108200905f011000b816821436587a9fb0004+短信息内容长度(16进制)+短信息内容

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧