开发移动cmpp2.0网关协议的问题(已经发送CMPP_CONNECT并成功接收CMPP_CONNECT_RESP)(200分)

  • 主题发起人 主题发起人 美国提子
  • 开始时间 开始时间

美国提子

Unregistered / Unconfirmed
GUEST, unregistred user!
我是SP已经成功连上ISMG网关了。
我发送短信(CMPP_SUBMIT)SP发送给ISMG,发不出。不知道为什么?我把这部分代码贴一下,希望能给我解答一下。
//////////////////////////////发送消息
procedure Thrdo2.this_dosubmit;
var
cql_CMPP_SUBMIT_tag:TCMPP_SUBMIT_tag;
cql_Cmpp_Submit_StoI:TCmpp_Submit_StoI;
cql_SizeIni1:integer;
begin
////////////////////////////////////////////////////////////////////////初始化
FillChar(cql_CMPP_SUBMIT_tag,SizeOf(tCMPP_SUBMIT_tag),0);
//////////////////////////////////////////////////////////////////////设置参数
with cql_CMPP_SUBMIT_tag do
begin
Pk_total:=1;
Pk_number:=1;
Registered_Delivery:=0;
Msg_level:=0;
strpcopy(Service_Id,'hello');
Fee_UserType:=0;
strpcopy(Fee_terminal_Id,'');
TP_pId:=0;
TP_udhi:=0;
Msg_Fmt:=15;
strpcopy(Msg_src,g_SP_Id);
strpcopy(FeeType,'02');
strpcopy(FeeCode,'000010');
strpcopy(ValId_Time,'');
strpcopy(At_Time,'');
strpcopy(Src_Id,g_Src_Id);
DestUsr_tl:=1;
strpcopy(Dest_terminal_Id,u_fssjhm);
Msg_Length:=140;
strpcopy(Msg_Content,u_nr);
//Reserve 保留
end;
try
/////////////////////////////////////////////////得到CMPP_SUBMIT消息字节长度
cql_SizeIni1:=Sizeof(cql_Cmpp_Submit_StoI);
FillChar(cql_Cmpp_Submit_StoI,cql_SizeIni1,0);
Move(cql_CMPP_SUBMIT_tag,cql_Cmpp_Submit_StoI.body,SizeOf( tCMPP_SUBMIT_tag));
with cql_Cmpp_Submit_StoI do
begin
head.Total_Length:=htonl(SizeOf( cql_Cmpp_Submit_StoI));
head.Command_Id:=htonl(CMPP_SUBMIT);
head.Sequence_Id:=htonl(main.this_cmpplsh);
end;
///////////////////////////////////////////////////////????????????
///问题在下面就是发送失败。长度是299,对的嘛~ 我不解?????????????
if main.ClientSocket1.Socket.SendBuf(cql_Cmpp_Submit_StoI,cql_SizeIni1) <> cql_SizeIni1 then
begin
//////////////////////////////////////////////////////标记页面发送失败数+1
g_yddx_sedbad:=inttostr(strtoint(g_yddx_sedbad)+1);
Synchronize(this_refreshsedbad);
u_title:=formatdatetime('yyyy年mm月dd日 hh:mm:ss',now)+':【移动短信发送线程发送CMPP_SUBMIT失败!】';
Synchronize(this_itemadd);
//////////////////////////////////////////////////////////发送成功,置标志
u_sedyddxquery.SQL.Text:=' UPDATE ' +
' LS_DXXHK PARTITION("DATAPRM") '+
' SET FSBZ = ''1'' '+
' WHERE DXXID= '+inttostr(u_dxxid);
end
else
begin
//////////////////////////////////////////////////////标记页面发送成功数+1
g_yddx_sedok:=inttostr(strtoint(g_yddx_sedok)+1);
Synchronize(this_refreshsedok);
u_title:=formatdatetime('yyyy年mm月dd日 hh:mm:ss',now)+':【移动短信发送线'+
'程发送CMPP_SUBMIT成功!短信内容:'+u_nr+'】';
Synchronize(this_itemadd);
//////////////////////////////////////////////////////////发送失败,置标志
u_sedyddxquery.SQL.Text:=' UPDATE ' +
' LS_DXXHK PARTITION("DATAPRM") '+
' SET FSBZ = ''2'' '+
' WHERE DXXID= '+inttostr(u_dxxid);
end;
u_sedyddxquery.Close;
u_sedyddxquery.ExecSQL;
except
on e: exception do
begin
//////////////////////////////////////////////////////标记页面发送失败数+1
g_yddx_sedbad:=inttostr(strtoint(g_yddx_sedbad)+1);
Synchronize(this_refreshsedbad);
u_title:=formatdatetime('yyyy年mm月dd日 hh:mm:ss',now)+':【移动短信发送线程发送CMPP_SUBMIT消息异常:' + e.Message;
Synchronize(this_itemadd);
//////////////////////////////////////////////////////////发送失败,置标志
u_sedyddxquery.SQL.Text:=' UPDATE ' +
' LS_DXXHK PARTITION("DATAPRM") '+
' SET FSBZ = ''2'' '+
' WHERE DXXID= '+inttostr(u_dxxid);
u_sedyddxquery.Close;
u_sedyddxquery.ExecSQL;
end;
end;
//////////////////////////////////////////////////////////////////////////////
end;
(网上也有相关的华为和东软的开发软件,也发不通)!
请高手为我解答~~~~ 200分不知道够不够 不够再加也行~~~
 
cmpp_submit_body中的字段Msg_Content定义为:array [0..0] of Char;

发送长度=cmpp_head + cmpp_submit_body + length(msg_content) - 1;
它是不定长的,首先要计算出长度,alloc出来后,将msg copy到Msg_content字段中,其它字段再进行移位copy。

如果长度正确,还有原因就是你上面的Msg_Fmt=15,表示Msg_Content为unicode字符类型,那么Msg_Length最长为70,不能=140,你上面有误。

你可以用Msg_Fmt=0,Msg_Length=4, Msg_Content='test'这样测试。
如果是Msg_Fmt=15,则Msg_Length=4, msg_Content='汉字'测试
并:Msg_Fmt=15,这样直接将字符copy到Msg_Content,我记得,并不是所有平台都支持的。原因忘了。
一般是将Msg_Fmt=8,然后将Msg: string,转换为WideString,再将里面的WideChar的顺序转换,高转低,低转高,再copy到Msg_Content.

好像这样吧,基本没错,如果还有错,自己拿手机发个deliver,看看msg_fmt和msg_content的关系。
 
另:网上有一堆的模拟CMPP服务器,2.0, 3.0都有。
 
我们的老程序已经开着 并且和移动网关相连。是不是因为这样我才发不出消息呢?我们的技术人员是这样说的。
 
后退
顶部