如何做一个手机短信发送模块?(100分)

  • 主题发起人 it_boy69
  • 开始时间
I

it_boy69

Unregistered / Unconfirmed
GUEST, unregistred user!
如何做一个手机短信发送模块?
 
需要熟悉AT指令,串口 通讯,PDU编码,解码
 
能不能给出实现向XXXXXXX号手机发短信的代码来?
 
你是只要发送模块吗?
好的,下面是我参考他人写的发送模块
发送 TXT文件的时候 直接使用这个就OK了
procedure TForm1.SendBtnTxtClick(Sender: TObject);
var
RMobile:string;
begin
if length(sendMemo.Text)>100 then
begin
application.MessageBox('请将信息控制在50字以内!','提示',mb_iconinformation);
sendMemo.SetFocus;
exit;
end
else
begin
RMobile := trim(recedit.Text);//接收人的手机号。
if copy(RMobile,1,2)='13' then
RMobile :='86'+RMobile;
//手机号前面加86
Comport1.WriteStr('AT+CSCA="+8613800592500"'+char(13));//这个是厦门地区的短信中心号码,你要修改成你那边的短信中心号码。
sleep(300);
Comport1.WriteStr('AT+CSCS="GSM"'+#13);//AT指令自己去查看吧
sleep(100);
Comport1.WriteStr('AT+CMGF=1'+#13#10);
sleep(300);
Comport1.WriteStr('AT'+#13#10);
sleep(300);
Comport1.WriteStr('AT+CMGS="'+ RMobile+'"'+#13);
sleep(500);
Comport1.WriteStr(sendMemo.Text+Char(26));
sleep(100);
end;
end;
//-----------------------------------------------
OK 下面是发送PDU格式的短信模块 会用到两个函数
//---该函数用来将PDU编码
function TForm1.encodePDUSMS(Mess : Widestring):String;
var
sLen,cur,i:integer;
strTmp:string;
begin
result := '';
sLen := length(Mess);
i := 1;
while i <= sLendo
begin
cur := ord(Mess);
//先返回序数值
FmtStr(strTmp,'%4.4X',[cur]);
//格式化序数值(BCD转换)
result := result + strTmp;
inc(i);
end;
end;
//-------------------------------------------------------
function TForm1.StrtoPDU(CentreNO,RcvNO: string): string;
var
StrTemp,PDURcvNo:String;
i,m,StrLen:integer;
begin
StrTemp:='';
PDURcvNo:='';
//解析短消息中中心号码
StrLen:=Length(CentreNO);
if (StrLen mod 2)<>0 then
//如果是奇数
begin
CentreNO:=CentreNO+'F';
StrLen:=StrLen+1;
end;
i:=1;
while i<=Strlendo
begin
StrTemp:=StrTemp+CentreNO[i+1]+CentreNO;
// 交换奇数位和偶数位
inc(i,2);
end;
StrTemp:='91'+StrTemp;
//将短信息中心号码前面加上字符91,91是国际化的意思
StrLen:=Length(StrTemp);
m:=(StrLen div 2);
StrTemp:=inttohex(m,2)+StrTemp;
//解析完短消息中中心号码
//解析收信人号码
if copy(RcvNo,1,2)='13' then
RcvNo:='86'+RcvNo;
//手机号前面加13
if copy(RcvNo,1,1)='0' then
RcvNo:='106'+RcvNo;
//小灵通前面加106
if copy(RcvNo,1,2)='86' then
StrTemp := StrTemp + '11000D91';
//手机91, 0D表示电话长度(13位),用16进制表示。
if copy(RcvNo,1,3)='106' then
begin
if Length(RcvNo)=15 then
StrTemp := StrTemp + '11000F81';
//小灵通81, 0F表示电话长度(15位),用16进制表示。
if Length(RcvNo)=14 then
StrTemp := StrTemp + '11000E81';
end;

StrLen:=Length(RcvNO);
if (StrLen mod 2)<>0 then
//如果是奇数
begin
RcvNO:=RcvNO+'F';
StrLen:=StrLen+1;
end;
i:=1;
while i<=Strlendo
begin
PDURcvNo:=PDURcvNo+RcvNO[i+1]+RcvNO;
// 交换奇数位和偶数位
inc(i,2);
end;
PDURcvNo:=PDURcvNO+'0008A7';
Result:=StrTemp+PDURcvNo;
end;
//----------------------------------------------------------
procedure TForm1.btnsendClick(Sender: TObject);
var
RMobile:string;
begin
if length(sendpdu.Text)>100 then
begin
application.MessageBox('请将信息控制在50字以内!','提示',mb_iconinformation);
sendpdu.SetFocus;
exit;
end
else
begin
PDUMess :=encodePDUSMS(Widestring(sendpdu.Text));
encodepdu.Text :=PDUMess;
PDULength :=InttoHex(length(PDUMess) div 2,2) ;
PDUText :=StrtoPDU(trim(cenedit.Text),Trim(recedit.Text))+PDULength+PDUMess;
decodepdu.Clear;
{用PDU方式发送短信不用AT指令设置短消息中心号码也可以发送成功,设置短信中心,返加Error,也能发送成功}
// MSComm1.Output :='AT+CSCA="+8613800311500"'+char(13);
//设置短信中心号码
// sleep(300);
RMobile := trim(recedit.Text);//接收人的手机号。
{if copy(RMobile,1,2)='13' then
RMobile :='86'+RMobile;
//手机号前面加86
Comport1.WriteStr('AT+CSCA="+8613800592500"'+char(13));
sleep(300);
}
Comport1.WriteStr('AT+CMGF=0'+#13);
sleep(300);
Comport1.WriteStr('AT+CSCS="HEX"'+#13);
//设置短消息中心时应使用PDU的UCS2编码方式,WaveCom是HEX,否则ERROR!
sleep(300);
Comport1.WriteStr('AT'+#13);
sleep(300);
Comport1.WriteStr('AT+CMGS='+inttostr((length(PDUText)-18) div 2)+#13);
sleep(300);
Comport1.WriteStr(PDUText+char(26));
sleep(300);
end;
end;
//上面就可以实现你的短信发送功能了 中英文都OK,不过使用前你要确保自己安装了CPORT控件,因为本程序使用的CPORT 使用其他控件想实现该功能 可以参考一下 基本上没有多大变化
 
NAVYSUN:
可是到那里去找CPORT????
 
用钱买。
 
短信猫也需要对DLL中的函数进行调用,比自己直接写相对比较容易,
 
NAVISUN:
请教几个问题
发送TXT 和 PDU 在实际效果上有什么区别?
是不是所有手机都不得能接收TXT? 它也是一种短信??
用这段程度发送短信,硬件需要什么? 只要计算机在INTERNET上就行吗? 还是...???
 
你好!刚看到你的消息。
首先CPORT控件,你可以在网上查找到,有很多,比如盒子上去查找。
其次,PDU可以显示中文,所以需要编码和解码比TXT复杂些,但大多数手机两种格式都支持。两者都是发送和接收短信格式。 另外,我这段程序是需要无线猫的。
你如果想在INTERNET发送的,就不能使用这个了
 

Similar threads

顶部