★☆★ 关于手机短信收发(用AT指令) ★☆★ ( 积分: 200 )

  • 主题发起人 主题发起人 唐佐平
  • 开始时间 开始时间
表示你收到一条新短信,呵呵!
 
知道是表示收到一条短信,
那是一条怎样的短信的?
谁发来的?内容是什么?
 
我也正在找解码,呵呵
at+cmgl=4所有短信列出来
出来的结果你自己去判断吧 ,呵呵!
 
已经发到你的邮箱里了,不知道‘唐佐平,满意否?
 
dongy_143:
谢谢你的邮件,但我不是要通过网站发短信,我是通过COM口来发送和接收短信
 
1.纯英文解码(PDU码)
function DecodeE(s: string): string;
function HexCharToInt(HexToken: char): Integer;
begin
{if HexToken>#97 then HexToken:=Chr(Ord(HexToken)-32);
{ use lowercase aswell }

Result := 0;

if (HexToken > #47) and (HexToken < #58) then { chars 0....9 }
Result := Ord(HexToken) - 48
else
if (HexToken > #64) and (HexToken < #71) then { chars A....F }
Result := Ord(HexToken) - 65 + 10;
end;

function HexCharToBin(HexToken: char): string;
var
DivLeft: integer;
begin
DivLeft := HexCharToInt(HexToken); { first HEX->BIN }
Result := '';
{ Use reverse dividing }
repeat { Trick; divide by 2 }
if odd(DivLeft) then { result = odd ? then bit = 1 }
Result := '1' + Result { result = even ? then bit = 0 }
else
Result := '0' + Result;

DivLeft := DivLeft div 2; { keep dividing till 0 left and length = 4 }
until (DivLeft = 0) and (length(Result) = 4); { 1 token = nibble = 4 bits }
end;

function HexToBin(HexNr: string): string;
{ only stringsize is limit of binnr }
var
Counter: integer;
begin
Result := '';

for Counter := 1 to length(HexNr) do
Result := Result + HexCharToBin(HexNr[Counter]);
end;

function pow(base, power: integer): integer;
var
counter: integer;
begin
Result := 1;

for counter := 1 to power do
Result := Result * base;
end;

function BinStrToInt(BinStr: string): integer;
var
counter: integer;
begin
if length(BinStr) > 16 then
raise ERangeError.Create(#13 + BinStr + #13 +
'is not within the valid range of a 16 bit binary.' + #13);

Result := 0;

for counter := 1 to length(BinStr) do
if BinStr[Counter] = '1' then
Result := Result + pow(2, length(BinStr) - counter);
end;

var
OctetStr: string;
OctetBin: string;
Charbin: string;
PrevOctet: string;
Counter: integer;
Counter2: integer;
begin
PrevOctet := '';
Result := '';

for Counter := 1 to length(s) do
begin
if length(PrevOctet) >= 7 then { if 7 Bit overflow on previous }
begin
if BinStrToInt(PrevOctet) <> 0 then
Result := Result + Chr(BinStrToInt(PrevOctet))
else
Result := Result + ' ';

PrevOctet := '';
end;

if Odd(Counter) then { only take two nibbles at a time }
begin
OctetStr := Copy(s, Counter, 2);
OctetBin := HexToBin(OctetStr);

Charbin := '';
for Counter2 := 1 to length(PrevOctet) do
Charbin := Charbin + PrevOctet[Counter2];

for Counter2 := 1 to 7 - length(PrevOctet) do
Charbin := OctetBin[8 - Counter2 + 1] + Charbin;

if BinStrToInt(Charbin) <> 0 then
Result := Result + Chr(BinStrToInt(CharBin))
else
Result := Result + ' ';

PrevOctet := Copy(OctetBin, 1, length(PrevOctet) + 1);
end;
end;
end;
 
中文和PDU码互换:
function EncodeUniCode(s:WideString):String;
var
i,len:Integer;
cur:Integer;
t:String;
begin
Result:='';
len:=Length(s);
i:=1;
while i<=len do
begin
cur:=ord(s);
Result:=Result+IntToHex(Cur,4);
inc(i);
end;
end;

function DecodeUniCode(s:String):WideString;
var
p:PWord;
i,len:Integer;
cur:Integer;
TempChar:WideChar;
t:String;
begin
New(p);

Result:='';
len:=Length(s) div 4;
i:=1;

for i:=0 to Len-1 do
begin
t:=Copy(s,4*i+1,4);
p^:=HexToInt(t);

Move(p^,TempChar,2);
Result:=Result+TempChar;
end;
Dispose(p);
end;
www.playicq.com上有这样的例子,你去找一下就可以了,
 
这里有个例子:
http://www.tomore.com/dispdocnew.php?id=4579
 
谢谢各位,已经找到一些感觉了,相信有各位的帮助我很快就会熟悉了,
 
好像delphi没有这个HexToInt函数吧
 
function HexToInt(HexStr:String):Integer;
var
i,TempInt,LocalInt:Integer;
begin
HexStr:=UpperCase(HexStr);

LocalInt:=1;
Result:=0;
for i:=Length(HexStr) downto 1 do
begin
if HexStr in ['0'..'9'] then
TempInt:=StrToInt(HexStr)
else
TempInt:=Ord(HexStr)-Ord('A')+10;

if i=Length(HexStr) then
LocalInt:=1
else
LocalInt:=LocalInt*16;

Result:=Result+TempInt*LocalInt;
end;
end;
 
to:唐佐平
我最近也在搞这个不知能否给我发一个看看,谢谢!
403dkt@163.com
 
有例子给一份如何多次dcydcy2002@163.com
 
非常感谢大家的帮助,还有下面一些问题:
1、“1_1_1_1”提供的下载是个好例子,上面有基本的方法,有需要的自己去下载即可:
http://www.tomore.com/dispdocnew.php?id=4579
2、我碰到的问题:在用AT指令收到的短信有三种情况:A-英文的PDU字符串,B-中文的PDU字符串,C-正常的字符串,比如发ABC收到的也是ABC,从PDU到字符串是不同的转换函数,那么请问我这么判断收到的短信该用哪个转换函数呢?
 
新问题:
怎样发送短信到小灵通(用At指令、短信内容包含汉字)?
我用发手机同样的AT指令发送失败,
 
发送短信到小灵通的问题已经解决,
详见我的笔记:
http://www.delphibbs.com/keylife/iblog_show.asp?xid=13241
 
《宇讯短信网关服务器-专业版》是国内首款支持(Delphi、VB、JS、C++)四种脚本语言的短信平台(类似于Word的VBA)。它可以用最快的速度、最低的成本、最简单省力的办法,为您部署出一套百变的短信收发平台。从而将短信应用由控件级的开发,直接提升到应用逻辑层的开发,为您节约大量宝贵的时间。系统自带“学生成绩短信查分系统”案例。

实现功能
1) 支持对移动、联通、小灵通短信的收发;
2) 支持管理人员发送“000”,短信网关自动返回运行状态;
3) 回复处理采用多线程方式,可以同时做到收发;
4) 支持短信内容中包含:中文、英文、混合编码的短信发送;
5) 脚本语言中拥有大量实用函数、类型、对象,并支持与各类数据库的连接,主要通过ADO方式,Delphi与C++Builder用户还可通过BDE方式连接;
6) 完善的日志记录功能,对所有短信收发日志都做记录;
7) 短信群发、实时/定时发送、实时接收短信;
8) 数据库接口支持Access、MS SQL Server、Oracle等ODBC兼容数据库;

应用范围
1) 企/事业单位信息系统集成短信功能;
2) 应用系统短信功能集成,ERP、CRM、OA等;
3) 网站实现短信收发功能;
4) 实时监控警报系统;
5) 各类短信查询系统,如:学生成绩查分系统;
6) 好多,不再一一列举,只要您能想的到;

网址:http://www.sms2008.net
下载:http://www.sms2008.net/files/KoSMSGateWay_Pro36.rar
 
多人接受答案了。
 
wlei9802@163.com
谢谢
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
I
回复
0
查看
805
import
I
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部