⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cmpp20.pas

📁 短消息的实现参考
💻 PAS
📖 第 1 页 / 共 2 页
字号:
  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 + -