移動CMPP2.0封裝


// 移動短信接口(cmpp 2.0)
//

unit untYiDongInterface;

interface

uses
SysUtils, untSocket, IdGlobal, MessageDigest_5, Types;

const
{$REGION 'Command_Id定義'}
CMPP_CONNECT = $00000001; // 請求連接
CMPP_CONNECT_RESP = $80000001; // 請求連接應答
CMPP_TERMINATE = $00000002; // 終止連接
CMPP_TERMINATE_RESP = $80000002; // 終止連接應答
CMPP_SUBMIT = $00000004; // 提交短信
CMPP_SUBMIT_RESP = $80000004; // 提交短信應答
CMPP_DELIVER = $00000005; // 短信下發
CMPP_DELIVER_RESP = $80000005; // 下發短信應答
CMPP_QUERY = $00000006; // 發送短信狀態查詢
CMPP_QUERY_RESP = $80000006; // 發送短信狀態查詢應答
CMPP_CANCEL = $00000007; // 刪除短信
CMPP_CANCEL_RESP = $80000007; // 刪除短信應答
CMPP_ACTIVE_TEST = $00000008; // 激活測試
CMPP_ACTIVE_TEST_RESP = $80000008; // 激活測試應答
CMPP_FWD = $00000009; // 消息前轉
CMPP_FWD_RESP = $80000009; // 消息前轉應答
CMPP_MT_ROUTE = $00000010; // MT路由請求
CMPP_MT_ROUTE_RESP = $80000010; // MT路由請求應答
CMPP_MO_ROUTE = $00000011; // MO路由請求
CMPP_MO_ROUTE_RESP = $80000011; // MO路由請求應答
CMPP_GET_ROUTE = $00000012; // 獲取路由請求
CMPP_GET_ROUTE_RESP = $80000012; // 獲取路由請求應答
CMPP_MT_ROUTE_UPDATE = $00000013; // MT路由更新
CMPP_MT_ROUTE_UPDATE_RESP = $80000013; // MT路由更新應答
CMPP_MO_ROUTE_UPDATE = $00000014; // MO路由更新
CMPP_MO_ROUTE_UPDATE_RESP = $80000014; // MO路由更新應答
CMPP_PUSH_MT_ROUTE_UPDATE = $00000015; // MT路由更新
CMPP_PUSH_MT_ROUTE_UPDATE_RESP = $80000015; // MT路由更新應答
CMPP_PUSH_MO_ROUTE_UPDATE = $00000016; // MO路由更新
CMPP_PUSH_MO_ROUTE_UPDATE_RESP = $80000016; // MO路由更新應答
{$ENDREGION}
const_SP_Id = 'HHJC'; // SP的企業代碼
const_shared_secret = ''; // 由中國移動與源地址實體事先商定
const_Version = 11; // 雙方協商的版本號(高位4bit表示主版本號,低位4bit表示次版本號

type
{$REGION '緩存定義'}
TByte21 = array [0 .. 20] of Byte;
TByte8 = array [0 .. 7] of Byte;
TChar21 = array [0 .. 20] of AnsiChar;
TChar10 = array [0 .. 9] of AnsiChar;
TChar140 = array [0 .. 139] of AnsiChar;
TChar8 = array [0 .. 7] of AnsiChar;
TChar6 = array [0 .. 5] of AnsiChar;
TChar16 = array [0 .. 15] of AnsiChar;
TChar2 = array [0 .. 1] of AnsiChar;
TChar17 = array [0 .. 16] of AnsiChar;
{$ENDREGION}
{$REGION '公用消息頭定義'}
{
Total_Length 4 Unsigned Integer 消息總長度(含消息頭及消息體)
Command_Id 4 Unsigned Integer 命令或響應類型
Sequence_Id 4 Unsigned Integer 消息流水號,順序累加,步長為1,循環使用(一對請求和應答消息的流水號必須相同)
}
TMsgHeader = packed record
Total_Length: Cardinal;
Command_Id: Cardinal;
Sequence_Id: Cardinal;
end;
{$ENDREGION}
{$REGION 'SP請求連接到ISMG(CMPP_CONNECT)操作'}
{
Source_Addr 6 Octet String 源地址,此處為SP_Id,即SP的企業代碼。
AuthenticatorSource 16 Octet String 用於鑒別源地址。其值通過單向MD5 hash計算得出,表示如下:
AuthenticatorSource =
MD5(Source_Addr+9 字節的0 +shared secret+timestamp)
Shared secret 由中國移動與源地址實體事先商定,timestamp格式為:MMDDHHMMSS,即月日時分秒,10位。
Version 1 Unsigned Integer 雙方協商的版本號(高位4bit表示主版本號,低位4bit表示次版本號)
Timestamp 4 Unsigned Integer 時間戳的明文,由客戶端產生,格式為MMDDHHMMSS,即月日時分秒,10位數字的整型,右對齊 。
}
TConnect = packed record
Source_Addr: TChar6;
AuthenticatorSource: TChar16;
Version: Byte;
Timestamp: Cardinal;
end;

TConnectMsg = packed record
Head: TMsgHeader;
Body: TConnect;
end;
{$ENDREGION}
{$REGION 'SP向ISMG提交短信(CMPP_SUBMIT)操作'}
{
Msg_Id 8 Unsigned Integer 信息標識,由SP側短信網關本身產生,本處填空。
Pk_total 1 Unsigned Integer 相同Msg_Id的信息總條數,從1開始
Pk_number 1 Unsigned Integer 相同Msg_Id的信息序號,從1開始
Registered_Delivery 1 Unsigned Integer 是否要求返回狀態確認報告:
0:不需要
1:需要
2:產生SMC話單
(該類型短信僅供網關計費使用,不發送給目的終端)
Msg_level 1 Unsigned Integer 信息級別
Service_Id 10 Octet String 業務類型,是數字、字母和符號的組合。
Fee_UserType 1 Unsigned Integer 計費用戶類型字段
0:對目的終端MSISDN計費;
1:對源終端MSISDN計費;
2:對SP計費;
3:表示本字段無效,對誰計費參見Fee_terminal_Id字段。
Fee_terminal_Id 21 Unsigned Integer 被計費用戶的號碼(如本字節填空,則表示本字段無效,對誰計費參見Fee_UserType字段,
本字段與Fee_UserType字段互斥)
TP_pId 1 Unsigned Integer GSM協議類型。詳細是解釋請參考GSM03.40中的9.2.3.9
TP_udhi 1 Unsigned Integer GSM協議類型。詳細是解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
Msg_Fmt 1 Unsigned Integer 信息格式
0:ASCII串
3:短信寫卡操作
4:二進制信息
8:UCS2編碼
 15:含GB漢字 。。。。。。
Msg_src 6 Octet String 信息內容來源(SP_Id)
FeeType 2 Octet String 資費類別
01:對“計費用戶號碼”免費
02:對“計費用戶號碼”按條計信息費
03:對“計費用戶號碼”按包月收取信息費
04:對“計費用戶號碼”的信息費封頂
05:對“計費用戶號碼”的收費是由SP實現
FeeCode 6 Octet String 資費代碼(以分為單位)
ValId_Time 17 Octet String 存活有效期,格式遵循SMPP3.3協議
At_Time 17 Octet String 定時發送時間,格式遵循SMPP3.3協議
Src_Id 21 Octet String 源號碼
SP的服務代碼或前綴為服務代碼的長號碼, 網關將該號碼完整的填到SMPP協議Submit_SM消息相應的source_addr字段,
該號碼最終在用戶手機上顯示為短消息的主叫號碼
DestUsr_tl 1 Unsigned Integer 接收信息的用戶數量(小於100個用戶)
Dest_terminal_Id 21*DestUsr_tl Octet String 接收短信的MSISDN號碼
Msg_Length 1 Unsigned Integer 信息長度(Msg_Fmt值為0時:<160個字節;其它<=140個字節)
Msg_Content Msg_length Octet String 信息內容
Reserve 8 Octet String 保留
}
TSubmit = packed record
Msg_Id: TByte8;
Pk_total: Byte;
Pk_number: Byte;
Registered_Delivery: Byte;
Msg_level: Byte;
Service_Id: TChar10;
Fee_UserType: Byte;
Fee_terminal_Id: TByte21;
TP_pId: Byte;
TP_udhi: Byte;
Msg_Fmt: Byte;
Msg_src: TChar6;
FeeType: TChar2;
FeeCode: TChar6;
ValId_Time: TChar17;
At_Time: TChar17;
Src_Id: TChar21;
DestUsr_tl: Byte;
Dest_terminal_Id: TByte21;
Msg_Length: Byte;
Msg_Content: TChar140;
Reserve: TChar8;
end;

TSubmitMsg = packed record
Head: TMsgHeader;
Body: TSubmit;
end;
{$ENDREGION}
{$REGION 'ISMG向SP送交短信(CMPP_DELIVER)操作'}
{
Msg_Id 8 Unsigned Integer 信息標識
生成算法如下:
采用64位(8字節)的整數:
時間(格式為MMDDHHMMSS,即月日時分秒):bit64~bit39,其中
bit64~bit61:月份的二進制表示;
bit60~bit56:日的二進制表示;
bit55~bit51:小時的二進制表示;
bit50~bit45:分的二進制表示;
bit44~bit39:秒的二進制表示;
短信網關代碼:bit38~bit17,把短信網關的代碼轉換為整數填寫到該字段中。
序列號:bit16~bit1,順序增加,步長為1,循環使用。
各部分如不能填滿,左補零,右對齊。
Dest_Id 21 Octet String 目的號碼
SP的服務代碼,一般4--6位,或者是前綴為服務代碼的長號碼;該號碼是手機用戶短消息的被叫號碼。
Service_Id 10 Octet String 業務類型,是數字、字母和符號的組合。
TP_pid 1 Unsigned Integer GSM協議類型。詳細解釋請參考GSM03.40中的9.2.3.9
TP_udhi 1 Unsigned Integer GSM協議類型。詳細解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
Msg_Fmt 1 Unsigned Integer 信息格式
0:ASCII串
3:短信寫卡操作
4:二進制信息
8:UCS2編碼
 15:含GB漢字
Src_terminal_Id 21 Octet String 源終端MSISDN號碼(狀態報告時填為CMPP_SUBMIT消息的目的終端號碼)
Registered_Delivery 1 Unsigned Integer 是否為狀態報告
0:非狀態報告
1:狀態報告
Msg_Length 1 Unsigned Integer 消息長度
Msg_Content Msg_length Octet String 消息內容
Reserved 8 Octet String 保留項
}
TDeliver = packed record
Msg_Id: TByte8;
Dest_Id: TChar21;
Service_Id: TChar10;
TP_pId: Byte;
TP_udhi: Byte;
Msg_Fmt: Byte;
Src_terminal_Id: TChar21;
Registered_Delivery: Byte;
Msg_Length: Byte;
Msg_Content: TChar140;
Reserved: TChar8;
end;

TDeliverMsg = packed record
Head: TMsgHeader;
Body: TDeliver;
end;
{$ENDREGION}
{$REGION '連接方法'}

function Connect(Sequence_Id, Timestamp: Cardinal;
SP_Id, AuthenticatorSource: AnsiString; Version: Byte): Boolean; // 連接
{
Source_Addr 6 Octet String 源地址,此處為SP_Id,即SP的企業代碼。
AuthenticatorSource 16 Octet String 用於鑒別源地址。其值通過單向MD5 hash計算得出,表示如下:
AuthenticatorSource =
MD5(Source_Addr+9 字節的0 +shared secret+timestamp)
Shared secret 由中國移動與源地址實體事先商定,timestamp格式為:MMDDHHMMSS,即月日時分秒,10位。
Version 1 Unsigned Integer 雙方協商的版本號(高位4bit表示主版本號,低位4bit表示次版本號)
Timestamp 4 Unsigned Integer 時間戳的明文,由客戶端產生,格式為MMDDHHMMSS,即月日時分秒,10位數字的整型,右對齊 。
}
{$ENDREGION}
{$REGION '發送方法'}
procedure Send(Sequence_Id: Cardinal; Pk_total, Pk_number, Registered_Delivery,
Msg_level, Fee_UserType, TP_pId, TP_udhi, Msg_Fmt, DestUsr_tl,
Msg_Length: Byte; Service_Id, Msg_src, FeeType, FeeCode, ValId_Time, At_Time,
Src_Id, Msg_Content: AnsiString; Dest_terminal_Id: AnsiString);
{
Msg_Id 8 Unsigned Integer 信息標識,由SP側短信網關本身產生,本處填空。
Pk_total 1 Unsigned Integer 相同Msg_Id的信息總條數,從1開始
Pk_number 1 Unsigned Integer 相同Msg_Id的信息序號,從1開始
Registered_Delivery 1 Unsigned Integer 是否要求返回狀態確認報告:
0:不需要
1:需要
2:產生SMC話單
(該類型短信僅供網關計費使用,不發送給目的終端)
Msg_level 1 Unsigned Integer 信息級別
Service_Id 10 Octet String 業務類型,是數字、字母和符號的組合。
Fee_UserType 1 Unsigned Integer 計費用戶類型字段
0:對目的終端MSISDN計費;
1:對源終端MSISDN計費;
2:對SP計費;
3:表示本字段無效,對誰計費參見Fee_terminal_Id字段。
Fee_terminal_Id 21 Unsigned Integer 被計費用戶的號碼(如本字節填空,則表示本字段無效,對誰計費參見Fee_UserType字段,本字段與Fee_UserType字段互斥)
TP_pId 1 Unsigned Integer GSM協議類型。詳細是解釋請參考GSM03.40中的9.2.3.9
TP_udhi 1 Unsigned Integer GSM協議類型。詳細是解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
Msg_Fmt 1 Unsigned Integer 信息格式
0:ASCII串
3:短信寫卡操作
4:二進制信息
8:UCS2編碼
 15:含GB漢字 。。。。。。
Msg_src 6 Octet String 信息內容來源(SP_Id)
FeeType 2 Octet String 資費類別
01:對“計費用戶號碼”免費
02:對“計費用戶號碼”按條計信息費
03:對“計費用戶號碼”按包月收取信息費
04:對“計費用戶號碼”的信息費封頂
05:對“計費用戶號碼”的收費是由SP實現
FeeCode 6 Octet String 資費代碼(以分為單位)
ValId_Time 17 Octet String 存活有效期,格式遵循SMPP3.3協議
At_Time 17 Octet String 定時發送時間,格式遵循SMPP3.3協議
Src_Id 21 Octet String 源號碼
SP的服務代碼或前綴為服務代碼的長號碼, 網關將該號碼完整的填到SMPP協議Submit_SM消息相應的source_addr字段,該號碼最終在用戶手機上顯示為短消息的主叫號碼
DestUsr_tl 1 Unsigned Integer 接收信息的用戶數量(小於100個用戶)
Dest_terminal_Id 21*DestUsr_tl Octet String 接收短信的MSISDN號碼
Msg_Length 1 Unsigned Integer 信息長度(Msg_Fmt值為0時:<160個字節;其它<=140個字節)
Msg_Content Msg_length Octet String 信息內容
Reserve 8 Octet String 保留

}
{$ENDREGION}
{$REGION '接收方法'}
procedure Accept(var Msg_Id: AnsiString; var Dest_Id, Service_Id, Src_terminal_Id,
Msg_Content: AnsiString; var TP_pId, TP_udhi, Msg_Fmt, Registered_Delivery,
Msg_Length: Byte);
{
Msg_Id 8 Unsigned Integer 信息標識
生成算法如下:
采用64位(8字節)的整數:
時間(格式為MMDDHHMMSS,即月日時分秒):bit64~bit39,其中
bit64~bit61:月份的二進制表示;
bit60~bit56:日的二進制表示;
bit55~bit51:小時的二進制表示;
bit50~bit45:分的二進制表示;
bit44~bit39:秒的二進制表示;
短信網關代碼:bit38~bit17,把短信網關的代碼轉換為整數填寫到該字段中。
序列號:bit16~bit1,順序增加,步長為1,循環使用。
各部分如不能填滿,左補零,右對齊。
Dest_Id 21 Octet String 目的號碼
SP的服務代碼,一般4--6位,或者是前綴為服務代碼的長號碼;該號碼是手機用戶短消息的被叫號碼。
Service_Id 10 Octet String 業務類型,是數字、字母和符號的組合。
TP_pid 1 Unsigned Integer GSM協議類型。詳細解釋請參考GSM03.40中的9.2.3.9
TP_udhi 1 Unsigned Integer GSM協議類型。詳細解釋請參考GSM03.40中的9.2.3.23,僅使用1位,右對齊
Msg_Fmt 1 Unsigned Integer 信息格式
0:ASCII串
3:短信寫卡操作
4:二進制信息
8:UCS2編碼
 15:含GB漢字
Src_terminal_Id 21 Octet String 源終端MSISDN號碼(狀態報告時填為CMPP_SUBMIT消息的目的終端號碼)
Registered_Delivery 1 Unsigned Integer 是否為狀態報告
0:非狀態報告
1:狀態報告
Msg_Length 1 Unsigned Integer 消息長度
Msg_Content Msg_length Octet String 消息內容
Reserved 8 Octet String 保留項
}
{$ENDREGION}

{$REGION '消息流水號'}
var
g_Sequence_Id: Cardinal = 0;
function GetSequence_Id: Integer; // 消息流水號,順序累加,步長為1,循環使用(一對請求和應答消息的流水號必須相同)
{$ENDREGION}

function MD5(value: AnsiString): string; // MD5加密

implementation

function MD5(value: AnsiString): string;
var
m: IMD5;
begin
m := GetMD5;
m.Init;
m.Update(TByteDynArray(RawByteString(value)), Length(value));
Result := LowerCase(m.AsString);
end;

function GetSequence_Id: Integer;
begin
if g_Sequence_Id = 4294967295 then
g_Sequence_Id := 0;
g_Sequence_Id := g_Sequence_Id + 1;
Result := g_Sequence_Id;
end;

procedure Accept(var Msg_Id: AnsiString; var Dest_Id, Service_Id, Src_terminal_Id,
Msg_Content: AnsiString; var TP_pId, TP_udhi, Msg_Fmt, Registered_Delivery,
Msg_Length: Byte);
var
Head: TMsgHeader;
Body: TDeliver;
Msg: TDeliverMsg;
buf: TIdBytes;
begin
// 初始化
buf := nil;
FillChar(Head, SizeOf(Head), '');
FillChar(Body, SizeOf(Body), '');
FillChar(Msg, SizeOf(Msg), '');
// 接收
if frmSocket.Connect then
begin
frmSocket.tcp.IOHandler.ReadBytes(buf, SizeOf(Msg), false);
BytesToRaw(buf, Msg, SizeOf(Msg));
Head := Msg.Head;
Body := Msg.Body;
// 解析
if Head.Command_Id = CMPP_DELIVER then
begin
SetLength(Msg_Id, SizeOf(Body.Msg_Id) + 1);
Move(Body.Msg_Id, Msg_Id[1], SizeOf(Body.Msg_Id));
SetLength(Dest_Id, SizeOf(Body.Dest_Id) + 1);
Move(Body.Dest_Id, Dest_Id[1], SizeOf(Body.Dest_Id));
SetLength(Service_Id, SizeOf(Body.Service_Id) + 1);
Move(Body.Service_Id, Service_Id[1], SizeOf(Body.Service_Id));
TP_pId := Body.TP_pId;
TP_udhi := Body.TP_udhi;
Msg_Fmt := Body.Msg_Fmt;
SetLength(Src_terminal_Id, SizeOf(Body.Src_terminal_Id) + 1);
Move(Body.Src_terminal_Id, Src_terminal_Id[1], SizeOf(Body.Src_terminal_Id));
Registered_Delivery := Body.Registered_Delivery;
Msg_Length := Body.Msg_Length;
SetLength(Msg_Content, SizeOf(Body.Msg_Content) + 1);
Move(Body.Msg_Content, Msg_Content[1], SizeOf(Body.Msg_Content));
end;
end;
end;

procedure Send(Sequence_Id: Cardinal; Pk_total, Pk_number, Registered_Delivery,
Msg_level, Fee_UserType, TP_pId, TP_udhi, Msg_Fmt, DestUsr_tl,
Msg_Length: Byte; Service_Id, Msg_src, FeeType, FeeCode, ValId_Time, At_Time,
Src_Id, Msg_Content: AnsiString; Dest_terminal_Id: AnsiString);
var
Head: TMsgHeader;
Body: TSubmit;
Msg: TSubmitMsg;
buf: TIdBytes;
begin
// 初始化
buf := nil;
FillChar(Head, SizeOf(Head), '');
FillChar(Body, SizeOf(Body), '');
FillChar(Msg, SizeOf(Msg), '');
if frmSocket.Connect then
begin
// 消息頭
Head.Total_Length := SizeOf(Head) + SizeOf(Body);
Head.Command_Id := CMPP_SUBMIT;
Head.Sequence_Id := Sequence_Id;
// 消息體
Body.Pk_total := Pk_total;
Body.Pk_number := Pk_number;
Body.Registered_Delivery := Registered_Delivery;
Body.Msg_level := Msg_level;
StrPCopy(Body.Service_Id, Service_Id);
Body.Fee_UserType := Fee_UserType;
Body.TP_pId := TP_pId;
Body.TP_udhi := TP_udhi;
Body.Msg_Fmt := Msg_Fmt;
StrPCopy(Body.Msg_src, Msg_src);
StrPCopy(Body.FeeType, FeeType);
StrPCopy(Body.FeeCode, FeeCode);
StrPCopy(Body.ValId_Time, ValId_Time);
StrPCopy(Body.At_Time, At_Time);
StrPCopy(Body.Src_Id, Src_Id);
Body.DestUsr_tl := DestUsr_tl;
Move(Dest_terminal_Id[1], Body.Dest_terminal_Id, Length(Dest_terminal_Id));
Body.Msg_Length := Msg_Length;
StrPCopy(Body.Msg_Content, Msg_Content);
// 消息
Msg.Head := Head;
Msg.Body := Body;
// 發送
buf := RawToBytes(Msg, SizeOf(Msg));
frmSocket.tcp.IOHandler.Write(buf);
end;
end;

function Connect(Sequence_Id, Timestamp: Cardinal;
SP_Id, AuthenticatorSource: AnsiString; Version: Byte): Boolean;
var
Head: TMsgHeader;
Body: TConnect;
Msg: TConnectMsg;
buf: TIdBytes;
begin
// 初始化
buf := nil;
FillChar(Head, SizeOf(Head), '');
FillChar(Body, SizeOf(Body), '');
FillChar(Msg, SizeOf(Msg), '');
Result := frmSocket.Connect;
if Result then
begin
// 消息頭
Head.Total_Length := SizeOf(TConnectMsg);
Head.Command_Id := CMPP_CONNECT;
Head.Sequence_Id := Sequence_Id;
// 消息體
StrPCopy(Body.Source_Addr, SP_Id);
StrPCopy(Body.AuthenticatorSource, AuthenticatorSource);
Body.Version := Version;
Body.Timestamp := Timestamp;
// 消息
Msg.Head := Head;
Msg.Body := Body;
// 發送
buf := RawToBytes(Msg, SizeOf(Msg));
frmSocket.tcp.IOHandler.Write(buf);
end;
end;

end.

 

客戶端調用示例:

function TSMSService.ConnectYDApp: Boolean; // 連接移動 應用層驗證
var
  AuthenticatorISMG: AnsiString;
  SP_Id, SharedSecret, timestr: AnsiString;
  LengthI, i, Md5UpLen: Integer;
  str1: array [0 .. 30] of ansiChar;
  md5str: md5digest;
  md5_con: MD5Context;
  Version: Byte;
  Sequence_Id: Cardinal;
  bBool: Boolean;
  Status: Byte;
  AuthenticatorSource: TByte16;
  s:AnsiString;
  iTime: Cardinal;
  Msg: TConnectRespMsg;
  buf: TIdBytes;
begin
  try
    timestr := FormatDateTime('MMDDHHMMSS', now);
    SP_Id := '731145';
    SharedSecret :='888888';
   // Source_Addr+9 字節的0 +shared secret+timestamp
   // 6+9+9+10=34
    StrPCopy(str1, SP_Id + '000000000' + SharedSecret + timestr);
    for i := 6 to 14 do
      str1[i] := #0;
    MD5Init(md5_con);
    MD5Update(md5_con, str1, 31);
    MD5Final(md5_con, md5str);
    move(md5str, AuthenticatorSource, 16);

    Sequence_Id := untYiDongInterface.GetSequence_Id;
    Version := $20;     // CMPP2.0
    untYiDongInterface.connect(Sequence_Id, StrToInt(timestr), SP_Id,AuthenticatorSource, Version);
    SMSService.CMPPTcp.IOHandler.ReadBytes(buf, SizeOf(Msg), False);
    BytesToRaw(buf, Msg, SizeOf(Msg));
    case Msg.Body.Status of
      0:
      begin
        OutputDebugView('CMPP 驗證成功:SPID:'+SP_ID);
      end;
      1:
      begin
        OutputDebugView('CMPP 消息結構錯誤');
      end;
      2:
      begin
        OutputDebugView('CMPP 非法源地址');
      end;
      3:
      begin
        OutputDebugView('CMPP:認證錯');
      end;
      4:
      begin
        OutputDebugView('CMPP:太高的版本');
      end;
    else
      OutputDebugView('CMPP 其他錯誤');
    end;
  except
    on e: Exception do
      OutputDebugView('ConnectYDApp 異常' + e.Message);
  end;
end;


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM