📄 cmpp20.pas
字号:
msgh.Command_Id:=StrToCard(Copy(astr,5,4));
msgh.Sequence_Id:=StrToCard(Copy(astr,9,4));
result:=msgh;
end;
//-----------------------有关CMPP_Connect消息函数的实现--------------------------
function GetCurrentTimestamp():Cardinal;
var
acard:Cardinal;
astr,bstr:String;
month,day,hour,minute,second,i,len,seq,startpoint:Byte;
begin
acard:=0;
seq:=1;
startpoint:=1;
astr:=TimeToStr(time);
len:=Length(astr);
for i:=1 to len do
if astr[i]=':' then
begin
if seq=1 then
begin
hour:=StrToInt(Copy(astr,startpoint,i-startpoint));
seq:=seq+1;
startpoint:=i+1;
end
else
begin
minute:=StrToInt(Copy(astr,startpoint,i-startpoint));
seq:=seq+1;
startpoint:=i+1;
end;
end;
second:=StrToInt(Copy(astr,startpoint,i-startpoint));
bstr:=DateToStr(date);
len:=Length(bstr);
seq:=1;
startpoint:=1;
for i:=1 to len do
if bstr[i]='-' then
begin
if seq=1 then
begin
seq:=seq+1;
startpoint:=i+1;
end
else
begin
month:=StrToInt(Copy(bstr,startpoint,i-startpoint));
seq:=seq+1;
startpoint:=i+1;
end;
end;
day:=StrToInt(Copy(bstr,startpoint,i-startpoint));
acard:=acard or month;
acard:=acard shl 6;
acard:=acard or day;
acard:=acard shl 6;
acard:=acard or hour;
acard:=acard shl 6;
acard:=acard or minute;
acard:=acard shl 6;
acard:=acard or second;
result:=acard;
end;
procedure InitConnect(var connect:CMPP_Connect;src_addr:String;ver:Byte);
begin
connect.Source_Addr:=CopyStr(src_addr,6);
connect.AuthenticatorSource:=CopyStr('1',16); //应该由MD5函数实现
connect.Version:=ver;
connect.Timestamp:=GetCurrentTimestamp;
end;
function StrConnect(connect:CMPP_Connect):String;
begin
result:=connect.Source_Addr+connect.AuthenticatorSource+Chr(connect.Version)
+CardToStr(connect.Timestamp);
end;
function RecConnect(astr:String):CMPP_Connect;
var
connect:CMPP_Connect;
begin
connect.Source_Addr:=Copy(astr,1,6);
connect.AuthenticatorSource:=Copy(astr,7,16);
connect.Version:=Ord(astr[23]);
connect.Timestamp:=StrToCard(Copy(astr,24,4));
result:=connect;
end;
//---------------------有关CMPP_Connect_RESP消息函数的实现----------------------
function StrConnectRESP(connect_resp:CMPP_Connect_RESP):String;
begin
result:=Chr(connect_resp.Status)+connect_resp.AuthenticatorISMG+
Chr(connect_resp.Version);
end;
function RecConnectRESP(astr:String):CMPP_Connect_RESP;
var
connect_resp:CMPP_Connect_RESP;
begin
connect_resp.Status:=Ord(astr[1]);
connect_resp.AuthenticatorISMG:=Copy(astr,2,16);
connect_resp.Version:=Ord(astr[18]);
result:=connect_resp;
end;
//-----------------------有关CMPP_Submit消息函数的实现--------------------------
procedure InitSubmit(var sub:CMPP_Submit;reg_delr,msg_lev:Byte;serv_id:String;
msgfmt:Byte;msg_src,fee_type,fee_code,val_time,attime,source_id:String);
var
i:Byte;
begin
sub.Msg_Id:=0;
sub.Pk_Total:=0;
sub.Pk_Number:=0;
sub.Registered_Delivery:=reg_delr;
sub.Msg_Level:=msg_lev;
sub.Service_Id:=CopyStr(serv_id,10);
sub.TP_pId:=7; //TP_pId和TP_udhi应该填写成正确GSM协议类型
sub.TP_udhi:=4;
sub.Msg_Fmt:=msgfmt;
sub.Msg_Src:=CopyStr(msg_src,6);
sub.FeeType:=CopyStr(fee_type,2);
sub.FeeCode:=CopyStr(fee_code,6);
sub.Valid_Time:=CopyStr(val_time,17);
sub.At_Time:=CopyStr(attime,17);
sub.Src_Id:=CopyStr(source_id,21);
sub.Reserve:=CopyStr('',8);
end;
procedure SetSubmitFeeUser(var sub:CMPP_Submit;user_type:Byte;term_id:String='');
begin
if(Length(term_id)<>0) then
begin
sub.Fee_UserType:=3;
sub.Fee_Terminal_Id:=CopyStr(term_id,21);
end
else
begin
sub.Fee_UserType:=user_type;
sub.Fee_Terminal_Id:=CopyStr('',21);
end;
end;
procedure SetSubmitMsgContent(var sub:CMPP_Submit;msg_cont:String);
var
len:Byte;
begin
len:=Length(msg_cont);
if(sub.Msg_Fmt=0) and (len>160) then
begin
MessageDlg('文本方式的信息内容过长,将会丢失一部分!',mtWarning,[mbOK],0);
SetLength(sub.Msg_Content,160);
sub.Msg_Content:=CopyStr(msg_cont,160);
sub.Msg_Length:=160;
end
else if(sub.Msg_Fmt<>0) and (len>140) then
begin
MessageDlg('非文本方式的信息内容过长,将会丢失一部分!',mtWarning,[mbOK],0);
SetLength(sub.Msg_Content,140);
sub.Msg_Content:=Copy(msg_cont,1,140);
sub.Msg_Length:=140;
end
else
begin
SetLength(sub.Msg_Content,len);
sub.Msg_Content:=Copy(msg_cont,1,len);
sub.Msg_Length:=len;
end;
end;
procedure SetSubmitMsgId(var sub:CMPP_Submit;recv_msg_id:Int64;pk_tl:Byte=0;
pk_num:Byte=0);
begin
sub.Msg_Id:=recv_msg_id;
sub.Pk_Total:=pk_tl;
sub.Pk_Number:=pk_num;
end;
function StrSubmit(submit:CMPP_Submit):String;
var
i:Byte;
dUserStr:String;
begin
dUserStr:='';
for i:=0 to submit.DestUsr_Tl-1 do
dUserStr:=dUserStr+submit.Dest_Terminal_ID[i];
result:=Int64ToStr(submit.Msg_Id)+Chr(submit.Pk_Total)+Chr(submit.Pk_Number)
+Chr(submit.Registered_Delivery)+Chr(submit.Msg_Level)+
submit.Service_Id+Chr(submit.Fee_UserType)+submit.Fee_Terminal_Id+
Chr(submit.TP_pId)+Chr(submit.TP_udhi)+Chr(submit.Msg_Fmt)+
submit.Msg_Src+submit.FeeType+submit.FeeCode+submit.Valid_Time
+submit.At_Time+submit.Src_Id+Chr(submit.DestUsr_Tl)+dUserStr+
Chr(submit.Msg_Length)+submit.Msg_Content+submit.Reserve;
end;
function RecSubmit(astr:String):CMPP_Submit;
var
submit:CMPP_Submit;
i,startpoint:Cardinal;
begin
submit.Msg_Id:=StrToInt64(Copy(astr,1,8));
submit.Pk_Total:=Ord(astr[9]);
submit.Pk_Number:=Ord(astr[10]);
submit.Registered_Delivery:=Ord(astr[11]);
submit.Msg_Level:=Ord(astr[12]);
submit.Service_Id:=Copy(astr,13,10);
submit.Fee_UserType:=Ord(astr[23]);
submit.Fee_Terminal_Id:=Copy(astr,24,21);
submit.TP_pId:=Ord(astr[45]);
submit.TP_udhi:=Ord(astr[46]);
submit.Msg_Fmt:=Ord(astr[47]);
submit.Msg_Src:=Copy(astr,48,6);
submit.FeeType:=Copy(astr,54,2);
submit.FeeCode:=Copy(astr,56,6);
submit.Valid_Time:=Copy(astr,62,17);
submit.At_Time:=Copy(astr,79,17);
submit.Src_Id:=Copy(astr,96,21);
submit.DestUsr_Tl:=Ord(astr[117]);
startpoint:=118;
if submit.DestUsr_Tl>0 then
begin
SetLength(submit.Dest_Terminal_ID,submit.DestUsr_Tl);
for i:=0 to submit.DestUsr_Tl-1 do
begin
submit.Dest_Terminal_ID[i]:=Copy(astr,startpoint,21);
startpoint:=startpoint+21;
end;
end;
submit.Msg_Length:=Ord(astr[startpoint]);
startpoint:=startpoint+1;
if submit.Msg_Length>0 then
begin
SetLength(submit.Msg_Content,submit.Msg_Length);
submit.Msg_Content:=Copy(astr,startpoint,submit.Msg_Length);
end;
startpoint:=startpoint+submit.Msg_Length;
submit.Reserve:=Copy(astr,startpoint,8);
result:=submit;
end;
//---------------------有关CMPP_Submit_RESP消息函数的实现-----------------------
function StrSubmitRESP(submit_resp:CMPP_Submit_RESP):String;
begin
result:=Int64ToStr(submit_resp.Msg_ID)+Chr(submit_resp.Result);
end;
function RecSubmitRESP(astr:String):CMPP_Submit_RESP;
var
submit_resp:CMPP_Submit_RESP;
begin
submit_resp.Msg_ID:=StrToInt64(Copy(astr,1,8));
submit_resp.Result:=Ord(astr[9]);
result:=submit_resp;
end;
//-----------------------有关CMPP_Deliver消息函数的实现-------------------------
Procedure InitDeliver(var delr:CMPP_Deliver;msg_id:Int64;dest_id:string;
serv_id:String;msg_fmt:Byte;src_term_id:String;
reg_del:Byte;msg_con:String;
sub_statrep:CMPP_Submit_StatREP);
begin
delr.Msg_ID:=msg_id;
delr.Dest_Id:=CopyStr(dest_id,21);
delr.Service_Id:=CopyStr(serv_id,10);
delr.TP_pId:=3;
delr.TP_udhi:=8;
delr.Msg_Fmt:=msg_fmt;
delr.Src_Terminal_Id:=CopyStr(src_term_id,21);
delr.Registered_Delivery:=reg_del;
if reg_del<>0 then
begin
SetLength(delr.Msg_Content,60);
delr.Msg_Content:=CopyStr(StrSubmitStatREP(sub_statrep),60);
delr.Msg_Length:=60;
end
else
begin
delr.Msg_Length:=Length(msg_con);
SetLength(delr.Msg_Content,delr.Msg_Length);
delr.Msg_Content:=CopyStr(msg_con,delr.Msg_Length);
end;
delr.Reserve:=CopyStr('',8);
end;
procedure InitSubmitStatREP(var submit_statrep:CMPP_Submit_StatREP);
begin
submit_statrep.Msg_ID:=34;
submit_statrep.Stat:=CopyStr('ACCEPTD',7);
submit_statrep.Submit_Time:=CopyStr('0306161445',10);
submit_statrep.Done_Time:=CopyStr('0306161446',10);
submit_statrep.Dest_Terminal_Id:=CopyStr('I do not know',21);
submit_statrep.SMSC_Sequence:=1034;
end;
function StrSubmitStatREP(submit_statrep:CMPP_Submit_StatREP):String;
begin
result:=Int64ToStr(submit_statrep.Msg_ID)+submit_statrep.Stat+
submit_statrep.Submit_Time+submit_statrep.Done_Time+
submit_statrep.Dest_Terminal_Id+CardToStr(submit_statrep.SMSC_Sequence);
end;
function StrDeliver(delr:CMPP_Deliver):String;
begin
result:=Int64ToStr(delr.Msg_ID)+delr.Dest_Id+delr.Service_Id+
Chr(delr.TP_pId)+Chr(delr.TP_udhi)+Chr(delr.Msg_Fmt)+
delr.Src_Terminal_Id+Chr(delr.Registered_Delivery)+
Chr(delr.Msg_Length)+delr.Msg_Content+delr.Reserve;
end;
function RecDeliver(astr:String):CMPP_Deliver;
var
deliver:CMPP_Deliver;
startpoint:Cardinal;
begin
deliver.Msg_ID:=StrToInt64(Copy(astr,1,8));
deliver.Dest_Id:=Copy(astr,9,21);
deliver.Service_Id:=Copy(astr,30,10);
deliver.TP_pId:=Ord(astr[40]);
deliver.TP_udhi:=Ord(astr[41]);
deliver.Msg_Fmt:=Ord(astr[42]);
deliver.Src_Terminal_Id:=Copy(astr,43,21);
deliver.Registered_Delivery:=Ord(astr[64]);
deliver.Msg_Length:=Ord(astr[65]);
startpoint:=66;
deliver.Msg_Content:=Copy(astr,startpoint,deliver.Msg_Length);
startpoint:=startpoint+deliver.Msg_Length;
deliver.Reserve:=Copy(astr,startpoint,8);
result:=deliver;
end;
function RecSubmitStatREP(astr:String):CMPP_Submit_StatREP;
var
submit_statrep:CMPP_Submit_StatREP;
begin
if(Length(astr)<>60) then
begin
messageDlg('命令解析时出现错误!即将终止......',mtWarning,[mbOK],0);
abort();
end
else
begin
submit_statrep.Msg_ID:=StrToInt64(Copy(astr,1,8));
submit_statrep.Stat:=Copy(astr,9,7);
submit_statrep.Submit_Time:=Copy(astr,16,10);
submit_statrep.Done_Time:=Copy(astr,26,10);
submit_statrep.Dest_Terminal_Id:=Copy(astr,36,21);
submit_statrep.SMSC_Sequence:=StrToCard(Copy(astr,57,4));
end;
result:=submit_statrep;
end;
//---------------------有关CMPP_Deliver_RESP消息函数的实现----------------------
procedure InitDeliverRESP(var deliver_resp:CMPP_Deliver_RESP;msg_id:Int64;
result:Byte);
begin
deliver_resp.Msg_ID:=msg_id;
deliver_resp.Result:=result;
end;
function StrDeliverRESP(deliver_resp:CMPP_Deliver_RESP):String;
begin
result:=Int64ToStr(deliver_resp.Msg_ID)+Chr(deliver_resp.Result);
end;
function RecDeliverRESP(astr:String):CMPP_Deliver_RESP;
var
deliver_resp:CMPP_Deliver_RESP;
begin
deliver_resp.Msg_ID:=StrToInt64(Copy(astr,1,8));
deliver_resp.Result:=Ord(astr[9]);
result:=deliver_resp;
end;
//-------------------有关CMPP_Active_Test_RESP消息函数的实现--------------------
procedure InitActiveTestRESP(var active_test_resp:CMPP_Active_Test_RESP;
reserved:Byte=0);
begin
active_test_resp.Reserved:=reserved;
end;
function StrActiveTestRESP(active_test_resp:CMPP_Active_Test_RESP):String;
begin
result:=Chr(active_test_resp.Reserved);
end;
function RecActiveTestRESP(astr:String):CMPP_Active_Test_RESP;
var
active_test_resp:CMPP_Active_Test_RESP;
begin
active_test_resp.Reserved:=Ord(astr[1]);
result:=active_test_resp;
end;
//------------------------------------------------------------------------------
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -