大家有没有使用过华为网关的API来发短信的?(100分)

  • 主题发起人 主题发起人 xfeiffer
  • 开始时间 开始时间
X

xfeiffer

Unregistered / Unconfirmed
GUEST, unregistred user!
现在碰到这个问题,好像很棘手的样子:
我使用的提交短信的函数(封装在他的DLL文件里的)
function SubmitA(OrgTON,OrgNPI:Byte;OrgAddr: PChar;DestTON,DestNPI:Byte;DestAddr: PChar;PRI,RD,RP,SRR,MR,DCS,PID:Byte;Schedule,Expire: PChar;Default_ID: DWord;UDHI:Byte;UDLen: DWord;UserData: PChar;var SM_ID: LongWord;var FCS: Byte):Integer;stdcall external 'SMEIDLL.DLL';

相关设置
//初始化SMS变量
OrgTON:=1; //源地址号码类型 1:国际号码 无符号型
OrgNPI:=1; //源地址编码方案 1:ISDN或电话号码编码方案 无符号型
OrgAddr:='8613800000000'; //源地址 字符串 最长20
DestTON:=1; //目标地址号码类型。取值同OrgTON。 无符号型
DestNPI:=1; //目标地址编码方案。取值同OrgNPI。 无符号型
DestAddr:='8613999999999'; //目标地址 字符串 最长20
PRI:=0; //SM优先级 无符号型
RD:=0; //保留,设置为0。 无符号型
RP:=0; //回应路径,保留,设置为0。 无符号型
SRR:=0; //状态报告,保留,设置为0;需要状态报告时,设置为1。 无符号型
MR:=0; //消息索引,保留,设置为0。 无符号型
DCS:=0; //数据编码方案 默认0,7位编码方案的ASCII码 无符号型
PID:=0; //协议类型,缺省为0。 无符号型
Schedule:=''; //定时时间 字符串 最长19
Expire:=''; //超时时间 字符串 最长19
Default_ID:=0; //缺省短消息的信息码,缺省为0。 无符号长整形
UDHI:=0;


发送短信时的设置
[blue]UDLen,ASM_ID:LongWord;
AFCS:Byte;
rRet:Integer;
UserData:='SMS Send Test!';

rRet:=SubmitA(OrgTon,OrgNPI,OrgAddr,DestTon,DestNPI,DestAddr,PRI,RD,RP,SRR,MR,DCS,PID,Schedule,Expire,Default_ID,UDHI,UDLen,UserData,ASM_ID,AFCS);
if(rRet=0)then
ShowMessage('发送成功!')
else
ShowMessage('发送失败!!');
[/blue]

[red]获取不到SM_ID和FCS这两个值,回来的全部是0[/red]

问下有哪位大侠用过这个东东,有没有碰到过这样的问题?麻烦讲解一下好不好?
 
我原来采用华为的,总是发送有点问题,后来我们采用indy直接发送。
 
那你能介绍你一下你的成功经验么?
呵呵……
 
为什么用SubmitA?
 
我没有用CMPP,用的SMPP,用的移动的SMS专线,端口5018(SMPP用的端口)
 
华为网关的API来发短信如何收费?
 
收费的话,跟移动谈的合同有关啊,每个地区不一样的。
 
xfeiffer大人,借用宝地,谢谢(新注册的帐号,以前的帐号忘记密码了,见谅,谢谢)

我是大四学生,做毕业设计用delphi 7开发短信平台,由于不懂理论,也找不到相关的书籍,所以做的很不顺利,从网上下载的源代码也看不懂,只能看懂个大概,具体原理还是看不懂,很闹心很闹心,希望大家能帮我.

我的delphi源代码如下:(是网上广为流传的代码,利用新浪网关收发短信的平台)
implementation

uses SendCodeInfo, RecCodeInfo;

{$R *.dfm}

function Tfrmsend.CheckCode(sCode:string):boolean;
var
i:integer;
begin
if(Trim(sCode)='') then
begin
Result:=false;
Exit;
end;
if(Length(Trim(sCode))<>11) then
begin
Result:=false;
Exit;
end;
for i:=1 to 11 do
begin
if not (Copy(sCode,i,1)[1] in ['0','1','2','3','4','5','6','7','8','9']) then
begin
Result:=false;
Exit;
end;
end;
Result:=true;
end;

procedure TfrmSend.FreeData;
var
i:integer;
begin
for i:=0 to cmbSendCode.Items.Count-1 do
begin
if(PSendCodeInfo(cmbSendCode.Items.Objects)<>nil) then
Dispose(PSendCodeInfo(cmbSendCode.Items.Objects));
end;
for i:=0 to cmbRecCode.Items.Count-1 do
begin
if(PRecCodeInfo(cmbRecCode.Items.Objects)<>nil) then
Dispose(PRecCodeInfo(cmbRecCode.Items.Objects));
end;
for i:=0 to cmbMsgList.Items.Count-1 do
begin
if(PMsgInfo(cmbMsgList.Items.Objects)<>nil) then
Dispose(PMsgInfo(cmbMsgList.Items.Objects));
end;
end;

procedure TfrmSend.SaveMsgInfo;
var
i :integer; //循环使用
iMsgCount :integer; //发送号码的位数
sMsgCaption:AnsiString; //号码主人名称
sMsgContent:AnsiString; //号码
strPath :AnsiString; //路径
iniFile :TIniFile; //操作ini文件
sMsg :AnsiString; //发送的消息
begin
strPath:=ExtractFilePath(Application.ExeName)+'SendSMS.ini';
try
iniFile:=TIniFile.Create(strPath);
iniFile.EraseSection('SendMsg');
IniFile.WriteString('SendMsg','MsgCount',IntToStr(cmbMsgList.Items.Count));
for i:=0 to cmbMsgList.Items.Count-1 do
begin
sMsgCaption:=PMsgInfo(cmbMsgList.Items.Objects)^.sMsgCaption;
sMsgContent:=PMsgInfo(cmbMsgList.Items.Objects)^.sMsgContent;
sMsg:=sMsgCaption+'_CC_'+sMsgContent;
IniFile.WriteString('SendMsg','Msg'+IntToStr(i+1),sMsg);
end;
finally
if(iniFile<>nil) then
iniFile.Free;
end;
end;

procedure TfrmSend.ReadMsgInfo;
var
iMsgCount :integer;
i :integer;
iCC :integer;
sMsgCaption:AnsiString;
sMsgContent:AnsiString;
iniFile :TIniFile;
strPath :AnsiString;
sMsg :AnsiString;
MsgInfo :PMsgInfo;
begin
strPath:=ExtractFilePath(Application.ExeName)+'SendSMS.ini';
try
iniFile:=TIniFile.Create(strPath);
iMsgCount:=iniFile.ReadInteger('SendMsg','MsgCount',0);
for i:=1 to iMsgCount do
begin
sMsg:=iniFile.ReadString('SendMsg','Msg'+IntToStr(i),'');
iCC:=Pos('_CC_',sMsg);
sMsgCaption:=Copy(sMsg,1,iCC-1);
sMsgContent:=Copy(sMsg,iCC+4,Length(sMsg)-iCC-3);
New(MsgInfo);
MsgInfo.sMsgCaption:=sMsgCaption;
MsgInfo.sMsgContent:=sMsgContent;
cmbMsgList.Items.AddObject(sMsgCaption,TObject(MsgInfo));
end;
finally
if(iniFile<>nil) then
iniFile.Free;
end;
end;

procedure TfrmSend.ReadSendCodeInfo;
var
iSendCount:integer;
i :integer;
iNC :integer;
iCP :integer;
sSendName :AnsiString;
sSendCode :AnsiString;
sPassword :AnsiString;
iniFile :TIniFile;
strPath :AnsiString;
sSend :AnsiString;
SendCodeInfo:PSendCodeInfo;
begin
strPath:=ExtractFilePath(Application.ExeName)+'SendSMS.ini';
try
iniFile:=TIniFile.Create(strPath);
iSendCount:=iniFile.ReadInteger('SendCode','SendCount',0);
for i:=1 to iSendCount do
begin
sSend:=iniFile.ReadString('SendCode','SendCode'+IntToStr(i),'');
iNC:=Pos('_NC_',sSend);
iCP:=Pos('_CP_',sSend);
sSendName:=Copy(sSend,1,iNC-1);
sSendCode:=Copy(sSend,iNC+4,iCP-iNC-4);
sPassword:=Copy(sSend,iCP+4,Length(sSend)-iCP);
New(SendCodeInfo);
SendCodeInfo.sSendCode:=sSendCode;
SendCodeInfo.sSendName:=sSendName;
SendCodeInfo.sPassword:=SPassword;
cmbSendCode.Items.AddObject(sSendName,TObject(SendCodeInfo));
end;
finally
if(iniFile<>nil) then
iniFile.Free;
end;
end;

procedure TfrmSend.ReadRecCodeInfo;
var
iRecCount:integer;
i :integer;
iNC :integer;
iCP :integer;
sRecName :AnsiString;
sRecCode :AnsiString;
iniFile :TIniFile;
strPath :AnsiString;
sRec :AnsiString;
RecCodeInfo:PRecCodeInfo;
begin
strPath:=ExtractFilePath(Application.ExeName)+'SendSMS.ini';
try
iniFile:=TIniFile.Create(strPath);
iRecCount:=iniFile.ReadInteger('ReceiveCode','RecCount',0);
for i:=1 to iRecCount do
begin
sRec:=iniFile.ReadString('ReceiveCode','RecCode'+IntToStr(i),'');
iNC:=Pos('_NC_',sRec);
sRecName:=Copy(sRec,1,iNC-1);
sRecCode:=Copy(sRec,iNC+4,Length(sRec)-iNC-3);
New(RecCodeInfo);
RecCodeInfo.sRecCode:=sRecCode;
RecCodeInfo.sRecName:=sRecName;
cmbRecCode.Items.AddObject(sRecName,TObject(RecCodeInfo));
end;
finally
if(iniFile<>nil) then
iniFile.Free;
end;
end;

procedure TfrmSend.SaveSendCodeInfo;
var
i :integer; //循环使用
iSendCount:integer; //发送号码的位数
sSendName :AnsiString; //号码主人名称
sSendCode :AnsiString; //号码
sPassword :AnsiString; //密码
strPath :AnsiString; //路径
iniFile :TIniFile; //操作ini文件
sSend :AnsiString;
begin
strPath:=ExtractFilePath(Application.ExeName)+'SendSMS.ini';
try
iniFile:=TIniFile.Create(strPath);
iniFile.EraseSection('SendCode');
IniFile.WriteString('SendCode','SendCount',IntToStr(cmbSendCode.Items.Count));
for i:=0 to cmbSendCode.Items.Count-1 do
begin
sSendName:=PSendCodeInfo(cmbSendCode.Items.Objects)^.sSendName;
sSendCode:=PSendCodeInfo(cmbSendCode.Items.Objects)^.sSendCode;
sPassword:=PSendCodeInfo(cmbSendCode.Items.Objects)^.sPassword;
sSend:=sSendName+'_NC_'+sSendCode+'_CP_'+sPassword;
IniFile.WriteString('SendCode','SendCode'+IntToStr(i+1),sSend);
end;
finally
if(iniFile<>nil) then
iniFile.Free;
end;
end;

procedure TfrmSend.SaveRecCodeInfo;
var
i :integer; //循环使用
iRecCount:integer; //发送号码的位数
sRecName :AnsiString; //号码主人名称
sRecCode :AnsiString; //号码
strPath :AnsiString; //路径
iniFile :TIniFile; //操作ini文件
sRec :AnsiString;
begin
strPath:=ExtractFilePath(Application.ExeName)+'SendSMS.ini';
try
iniFile:=TIniFile.Create(strPath);
iniFile.EraseSection('ReceiveCode');
IniFile.WriteString('ReceiveCode','RecCount',IntToStr(cmbRecCode.Items.Count));
for i:=0 to cmbRecCode.Items.Count-1 do
begin
sRecName:=PRecCodeInfo(cmbRecCode.Items.Objects)^.sRecName;
sRecCode:=PRecCodeInfo(cmbRecCode.Items.Objects)^.sRecCode;
sRec:=sRecName+'_NC_'+sRecCode;
IniFile.WriteString('ReceiveCode','RecCode'+IntToStr(i+1),sRec);
end;
finally
if(iniFile<>nil) then
iniFile.Free;
end;
end;

function TfrmSend.DeleteCR(s:string):string;
var
i:integer; //循环使用
begin
i:=Pos(#$d,s);
while i<>0 do
begin
Delete(s,i,1);
i:=Pos(#$d,s);
end;
i:=Pos(#$a,s);
while i<>0 do
begin
Delete(s,i,1);
i:=pos(#$a,s);
end;
Result:=s;
end;

procedure TfrmSend.btnSendClick(Sender: TObject);
var
ovTargetFrameName:OleVariant;
ovPostData :OleVariant;
ovFlags :OleVariant;
ovHeads :OleVariant;
begin
if(cmbRecCode.ItemIndex=-1) then
begin
MessageBox(Handle,'选择接收的号码!','提示信息',MB_OK);
Exit;
end;
if(CheckCode(PRecCodeInfo(cmbRecCode.Items.Objects[cmbRecCode.ItemIndex])^.sRecCode)=false) then
begin
MessageBox(Handle,'接收号码不正确!','提示信息',MB_OK);
Exit;
end;
if(cmbSendCode.ItemIndex=-1) then
begin
MessageBox(Handle,'选择发送的号码!','提示信息',MB_OK);
Exit;
end;
if(CheckCode(PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sSendCode)=false) then
begin
MessageBox(Handle,'发送号码不正确!','提示信息',MB_OK);
Exit;
end;
if(Trim(memSendContent.Text)='') then
begin
MessageBox(Handle,'输入发送的内容!','提示信息',MB_OK);
memSendContent.SetFocus;
Exit;
end;
iSendSMS:=0;
ovTargetFrameName:=0;
ovPostData:=0;
ovHeads:=0;
ovFlags:=0;
wbSendSMS.Navigate('http://sms.sina.com.cn/docs/send.html',
ovFlags,ovTargetFrameName,ovPostData,ovHeads);
sbSendSMS.Panels.Items[0].Text:='正在发送...';
end;

procedure TfrmSend.btnCancelClick(Sender: TObject);
begin
wbSendSMS.Stop;
//Close;
end;

procedure TfrmSend.wbSendSMSDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i :integer; //循环使用
iInputCount:integer; //计算<Input> 的次数
ovDoc :OleVariant; //取得网页的内容
sSendCode :AnsiString; //发送手机号码
sPassword :AnsiString; //发送短消息的密码
sRecCode :AnsiString; //接收代码
begin
case iSendSMS of
0:
begin
Inc(iSendSMS);
ovDoc:=(Sender as TWebBrowser).Document;
iInputCount:=0;
for i:=0 To ovDoc.All.Length-1 do
begin
if (ovDoc.All.Item(i).tagName = 'TEXTAREA')and //一定大写
(ovDoc.All.Item(i).name='msg')then //大小写与原文一致
begin
ovDoc.All.Item(i).Value:=DeleteCR(memSendContent.Lines.Text);
Inc(iInputCount);
end;
if (ovDoc.All.Item(i).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(i).type='text')and //大小写与原文一致
(ovDoc.All.Item(i).Name='mob1')then
begin
sRecCode:=PRecCodeInfo(cmbRecCode.Items.Objects[cmbRecCode.ItemIndex])^.sRecCode;
ovDoc.All.Item(i).Value:=Trim(sRecCode);
Inc(iInputCount);
end;
if (ovDoc.All.Item(i).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(i).type='text')and //大小写与原文一致
(ovdoc.All.Item(i).Name='user')then
begin
sSendCode:=PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sSendCode;
ovDoc.All.Item(i).Value:=Trim(sSendCode);
Inc(iInputCount);
end;
if (ovDoc.All.Item(i).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(i).type='password')and //大小写与原文一致
(ovDoc.All.Item(i).Name='passwd')then
begin
sPassword:=PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sPassword;
ovDoc.All.Item(i).Value:=Trim(sPassword);
Inc(iInputCount);
end;
if (ovDoc.All.Item(i).tagName = 'INPUT')and //一定大写
(ovDoc.All.Item(i).type='submit')and //大小写与原文一致
(ovDoc.All.Item(i).value=' 发送 ')then
begin
if iInputCount=4 then
ovDoc.All.Item(i).Click;
Inc(iInputCount);
end;
end;
end;
1:
begin
ovDoc:=(Sender as TWebBrowser).Document;
Inc(iSendSMS);
if(Pos('发送成功',ovDoc.All.item.innerhtml)<>0) then
sbSendSMS.Panels.Items[0].Text:='发送成功'
else
sbSendSMS.Panels.Items[0].Text:='发送失败';
end;
end;
end;

procedure TfrmSend.sbSaveSendCodeClick(Sender: TObject);
begin
frmSendCodeInfo:=TfrmSendCodeInfo.Create(Self);
frmSendCodeInfo.ShowModal;
frmSendCodeInfo.Free;
end;

procedure TfrmSend.sbSaveRecCodeClick(Sender: TObject);
begin
frmRecCodeInfo:=TfrmRecCodeInfo.Create(Self);
frmRecCodeInfo.ShowModal;
frmRecCodeInfo.Free;
end;

procedure TfrmSend.memSendContentChange(Sender: TObject);
begin
memSendContent.Text:=DeleteCR(memSendContent.Lines.Text);
end;

procedure TfrmSend.sbDeleteRecCodeClick(Sender: TObject);
begin
cmbRecCode.DeleteSelected;
SaveRecCodeInfo;
end;

procedure TfrmSend.sbDeleteSendCodeClick(Sender: TObject);
begin
cmbSendCode.DeleteSelected;
SaveSendCodeInfo;
end;

procedure TfrmSend.FormCreate(Sender: TObject);
begin
ReadSendCodeInfo;
ReadRecCodeInfo;
ReadMsgInfo;
end;

procedure TfrmSend.cmbRecCodeChange(Sender: TObject);
begin
if(cmbRecCode.ItemIndex<>-1) then
begin
sbSendSMS.Panels.Items[1].Text:='接收:'+PRecCodeInfo(cmbRecCode.Items.Objects[cmbRecCode.ItemIndex])^.sRecCode;
end;
end;

procedure TfrmSend.cmbSendCodeChange(Sender: TObject);
begin
if(cmbSendCode.ItemIndex<>-1) then
begin
sbSendSMS.Panels.Items[2].Text:='发送:'+PSendCodeInfo(cmbSendCode.Items.Objects[cmbSendCode.ItemIndex])^.sSendCode;
end;
end;

procedure TfrmSend.sbDeleteMsgClick(Sender: TObject);
begin
cmbMsgList.DeleteSelected;
SaveMsgInfo;
end;

procedure TfrmSend.sbSaveMsgClick(Sender: TObject);
var
sMsgCaption:AnsiString;
sMsgContent:AnsiString;
MsgInfo:PMsgInfo;
begin
if(Trim(cmbMsgList.Text)='') then
begin
cmbMsgList.SetFocus;
MessageBox(Handle,'输入消息标题','提示信息',MB_OK);
Exit;
end;
if(Trim(memSendContent.Text)='') then
begin
memSendContent.SetFocus;
MessageBox(Handle,'没有消息内容!','提示信息',MB_OK);
Exit;
end;
if(cmbMsgList.Items.IndexOf(Trim(cmbMsgList.Text))<>-1) then
begin
if(MessageBox(Handle,'已经有此消息!,继续加入以此标题的消息?','提示信息',MB_YESNO)=IDNO) then
Exit;
end;
sMsgCaption:=Trim(cmbMsgList.Text);
sMsgContent:=Trim(memSendContent.Text);
New(MsgInfo);
MsgInfo.sMsgCaption:=sMsgCaption;
MsgInfo.sMsgContent:=sMsgContent;
cmbMsgList.Items.AddObject(sMsgCaption,TObject(MsgInfo));
SaveMsgInfo;
end;

procedure TfrmSend.cmbMsgListChange(Sender: TObject);
begin
if(cmbMsgList.ItemIndex<>-1) then
begin
memSendContent.Lines.Clear;
memSendContent.Text:=PMsgInfo(cmbMsgList.Items.Objects[cmbMsgList.ItemIndex])^.sMsgContent;
end;
end;

procedure TfrmSend.FormDestroy(Sender: TObject);
begin
FreeData;
end;

procedure TfrmSend.lblTSClick(Sender: TObject);
begin
ShellExecute(Handle,'open','http://sms.sina.com.cn/docs/term2.html',nil,nil,SW_SHOWNORMAL);
end;

end.


希望大家能在白忙中抽出时间帮我看看这段代码,帮我分析分析采用的什么原理,可能这个代码并不是最好的,各位高手们或许以前也做过短信平台开发的,如果你们有更好的实现方法,请给以指点,谢谢!!
我的QQ是250684246,大家有什么好的意见可以在网上告诉我;或者有什么好的资料可以传给我或者发送到我的邮箱:jmsw1984@163.com,最后谢谢大家了!
 
你看他提供的结构体,实际上就是每个字节。采用INdy连接然后自己开一个buffer,填写进去,就发送了。
 
dcsdcs,您不能讲得详细一点么???[:)]
xfeiffer@gmail.com
 
哈哈阿,有没有FOR SP的版本?
 
我们讨论的是自己看SMPP协议之后自己开发发收SMS的程序
 
接受答案了.
 
后退
顶部