我用Delphi写SGIP1.2的SP端为什么在模拟器中SMG登陆SP的时候Login_Type会等于52而不是2呢???高手请指教~
一下是SGIP的协议部分请高手指教!谢谢!
unit SGIP_Protocol12;interfaceconst  SGIP_BIND = $1;
  SGIP_BIND_RESP = $80000001;
  SGIP_UNBIND = $2;
  SGIP_UNBIND_RESP = $80000002;
  SGIP_SUBMIT = $3;
  SGIP_SUBMIT_RESP = $80000003;
  SGIP_DELIVER = $4;
  SGIP_DELIVER_RESP = $80000004;
  SGIP_REPORT = $5;
  SGIP_REPORT_RESP = $80000005;
  SGIP_ADDSP = $6;
  SGIP_ADDSP_RESP = $80000006;
  SGIP_MODIFYSP = $7;
  SGIP_MODIFYSP_RESP = $80000007;
  SGIP_DELETESP = $8;
  SGIP_DELETESP_RESP = $80000008;
  SGIP_QUERYROUTE = $9;
  SGIP_QUERYROUTE_RESP = $80000009;
  SGIP_ADDTELESEG = $a;
  SGIP_ADDTELESEG_RESP = $8000000a;
  SGIP_MODIFYTELESEG = $b;
  SGIP_MODIFYTELESEG_RESP = $8000000b;
  SGIP_DELETETELESEG = $c;
  SGIP_DELETETELESEG_RESP = $8000000c;
  SGIP_ADDSMG = $d;
  SGIP_ADDSMG_RESP = $8000000d;
  SGIP_MODIFYSMG = $e;
  SGIP_MODIFYSMG_RESP = $0000000e;
  SGIP_DELETESMG = $f;
  SGIP_DELETESMG_RESP = $8000000f;
  SGIP_CHECKUSER = $10;
  SGIP_CHECKUSER_RESP = $80000010;
  SGIP_USERRPT = $11;
  SGIP_USERRPT_RESP = $80000011;
  SGIP_TRACE = $1000;
  SGIP_TRACE_RESP = $80001000;  MSG_LENGTH = 140; //短信内容长度
  DestUsr_tl = 1; //接收信息的用户数量(小于100个用户)。const
    //返回值  ERR_Return = $00; //无错误,命令正确接收
  ERR_BIND_Return = $01; //非法登录,如登录名、口令出错、登录名与口令不符等。
  ERR_BIND_Repetition_Return = $02; //重复登录,如在同一TCP/IP连接中连续两次以上请求登录。
  ERR_BIND_Link_Full_Return = $03; //连接过多,指单个节点要求同时建立的连接数过多。
  ERR_BIND_Logintype_Return = $04; //登录类型错,指bind命令中的logintype字段出错。  ERR_Parameter_Format_Return = $05; //参数格式错,指命令中参数值与参数类型不符或与协议规定的范围不符。
  ERR_Mobile_Return = $06; //非法手机号码,协议中所有手机号码字段出现非86130号码或手机号码前未加"86"时都应报错。
  ERR_Msg_ID_Return = $07; //消息ID错
  ERR_Msg_Len_Return = $08; //信息长度错
  ERR_Number_Return = $09; //非法序列号,包括序列号重复、序列号格式错误等
  ERR_GNS_Return = $10; //非法操作GNS
  ERR_Server_Busy_Return = $11; //节点忙,指本节点存储队列满或其他原因,暂时不能提供服务的情况
  ERR_Address_Arrive_Return = $21; //目的地址不可达,指路由表存在路由且消息路由正确但被路由的节点暂时不能提供服务的情况
  ERR_Router_Return = $22; //路由错,指路由表存在路由但消息路由出错的情况,如转错SMG等
  ERR_Router_Null_Return = $23; //路由不存在,指消息路由的节点在路由表中不存在  ERR_FeeNumber_Invalid = $24; //计费号码无效,鉴权不成功时反馈的错误信息
  ERR_User_Invalid_Return = $25; //用户不能通信(如不在服务区、未开机等情况)
  ERR_Phone_Memory_Invalid_Return = $26; //手机内存不足
  ERR_Phone_Message_Invalid_Return = $27; //手机不支持短消息
  ERR_Message_Receive_Return = $28; //手机接收短消息出现错误
  ERR_User_Return = $29; //不知道的用户  ERR_Function_Return = $30; //不提供此功能
  ERR_Equipment_Return = $31; //非法设备
  ERR_System_Return = $32; //系统失败
  ERR_Center_Full_Return = $33; //短信中心队列满//其它 //其它错误码(待定义)    //Submit 返回值
  ERR_SUBMIT_SUCCESS = $00; //成功    //Deliver 返回值
  ERR_DELIVER_SUCCESS = $00; //成功
    //Report 返回值
  ERR_Report_SUCCESS = $00; //成功
    //Unbind 返回值
  ERR_Unbind_SUCCESS = $00; //成功
  ERR_Unbind_FAULT = $01; //失败type
  TEmpty = record //空纪录
  end;    //消息头
  PSGIP_HEAD_tag = ^TSGIP_HEAD_tag;
  TSGIP_HEAD_tag = packed record
    Message_Length: LongWord; //消息总长度(含消息头及消息体)
    Command_ID: LongWord; //命令或响应类型
    SNumber1, SNumber2, SNumber3: longword; //序列号,消息流水号,顺序累加,步长为1,循环使用(一对请求和应答消息的流水号必须相同)
  end;    ////////////////////////////////////////////////////////////////////////////
    // SP 请求连接到 SMG
  PSGIP_Bind_tag = ^TSGIP_Bind_tag;
  TSGIP_Bind_tag = packed record
    Login_Type: Byte; //登录类型。1:SP向SMG建立的连接,用于发送命令 2:SMG向SP建立的连接,用于发送命令 3:SMG之间建立的连接,用于转发命令 4:SMG向GNS建立的连接,用于路由表的检索和维护 5:GNS向SMG建立的连接,用于路由表的更新 6:主备GNS之间建立的连接,用于主备路由表的一致性 11:SP与SMG以及SMG之间建立的测试连接,用于跟踪测试 其它:保留
    Login_Name: array[0..15] of Char; //服务器端给客户端分配的登录名
    Login_Passowrd: array[0..15] of Char; //服务器端和Login Name对应的密码
    Reserve: array[0..7] of Char; //保留,扩展用
  end;    ////////////////////////////////////////////////////////////////////////////
    // SMG 返回链接状态到 SP
  PSGIP_Bind_RESP_tag = ^TSGIP_Bind_RESP_tag;
  TSGIP_Bind_RESP_tag = packed record
    Result: Byte; //Bind执行命令是否成功。0:执行成功 其它:错误码
    Reserve: array[0..7] of Char; //保留,扩展用
  end;    ////////////////////////////////////////////////////////////////////////////
    // SP 或 SMG 请求拆除连接
  TSGIP_Unbind_tag = TEmpty;
  TSGIP_Unbind_RESP_tag = TEmpty;    ////////////////////////////////////////////////////////////////////////////
    // SP 向 SMG 提交短信
  PSGIP_SUBMIT_tag = ^TSGIP_SUBMIT_tag;
  TSGIP_SUBMIT_tag = packed record    SPNumber: array[0..20] of Char; //SP的接入号码
    ChargeNumber: array[0..20] of Char; //付费号码,手机号码前加"86"国别标志;当且仅当群发且对用户收费时为空;如果为空,则该条短消息产生的费用由UserNumber代表的用户支付;如果为全零字符串"000000000000000000000",表示该条短消息产生的费用由SP支付。
    UserCount: Byte; //接收短消息的手机数量,取值范围1至100
    UserNumber: array[0..20] of Char; //接收该短消息的手机号,该字段重复UserCount指定的次数,手机号码前加"86"国别标志
    CorpId: array[0..4] of Char; //企业代码,取值范围0-99999
    ServiceType: array[0..9] of Char; //业务代码,由SP定义
    FeeType: Byte; //计费类型
    FeeValue: array[0..5] of Char; //取值范围0-99999,该条短消息的收费值,单位为分,由SP定义对于包月制收费的用户,该值为月租费的值
    GivenValue: array[0..5] of Char; //取值范围0-99999,赠送用户的话费,单位为分,由SP定义,特指由SP向用户发送广告时的赠送话费
    AgentFlag: Byte; //代收费标志,0:应收;1:实收
    MorelatetoMTFlag: Byte; //引起MT消息的原因 0-MO点播引起的第一条MT消息;1-MO点播引起的非第一条MT消息;2-非MO点播引起的MT消息;3-系统反馈引起的MT消息。
    Priority: Byte; //优先级0-9从低到高,默认为0
    ExpireTime: array[0..16] of Char; //短消息寿命的终止时间,如果为空,表示使用短消息中心的缺省值。时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
    ScheduleTime: array[0..16] of Char; //短消息定时发送的时间,如果为空,表示立刻发送该短消息。时间内容为16个字符,格式为"yymmddhhmmsstnnp" ,其中"tnnp"取固定值"032+",即默认系统为北京时间
    ReportFlag: Byte; //状态报告标记 0-该条消息只有最后出错时要返回状态报告 1-该条消息无论最后是否成功都要返回状态报告 2-该条消息不需要返回状态报告 3-该条消息仅携带包月计费信息,不下发给用户,要返回状态报告 其它-保留 缺省设置为0
    TP_pid: Byte; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
    TP_udhi: Byte; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
    MessageCoding: Byte; //短消息的编码格式。0:纯ASCII字符串 3:写卡操作 4:二进制编码 8:UCS2编码 15: GBK编码 其它参见GSM3.38第4节:SMS Data Coding Scheme
    MessageType: Byte; //信息类型:0-短消息信息 其它:待定
    MessageLength: Byte; //短消息的长度
    MessageContent: array[0..MSG_LENGTH - 1] of Char; //短消息的内容
    Reserve: array[0..7] of Char; //保留,扩展用  end;  pSGIP_SUBMIT_RESP_tag = ^tSGIP_SUBMIT_RESP_tag;
  tSGIP_SUBMIT_RESP_tag = packed record
    Result: Byte; //Submit命令是否成功接收。0:接收成功 其它:错误码
    Reserve: array[0..7] of Char; //保留,扩展用
  end;

解决方案 »

  1.   


        ////////////////////////////////////////////////////////////////////////////
        // SP 向 SMG 查询发送短信状态
      PSGIP_QUERY_tag = ^TSGIP_QUERY_tag;
      TSGIP_QUERY_tag = packed record
        Time: array[0..7] of Char; //时间YYYYMMDD(精确至日)
        Query_Type: Byte; //查询类别0:总数查询1:按业务类型查询
        Query_Code: array[0..9] of Char; //查询码当Query_struct为0时,此项无效;当Query_struct为1时,此项填写业务类型Service_Id.
        Reserve: array[0..7] of Char; //保留
      end;  PSGIP_QUERY_RESP_tag = ^TSGIP_QUERY_RESP_tag;
      TSGIP_QUERY_RESP_tag = packed record
        Time: array[0..7] of Char; //时间(精确至日)
        Query_Type: Byte; //查询类别0:总数查询1:按业务类型查询
        Query_Code: array[0..9] of Char; //查询码
        MT_TLMsg: LongWord; //从SP接收信息总数
        MT_Tlusr: LongWord; //从SP接收用户总数
        MT_Scs: LongWord; //成功转发数量
        MT_WT: LongWord; //待转发数量
        MT_FL: LongWord; //转发失败数量
        MO_Scs: LongWord; //向SP成功送达数量
        MO_WT: LongWord; //向SP待送达数量
        MO_FL: LongWord; //向SP送达失败数量
      end;    ////////////////////////////////////////////////////////////////////////////
        // SMG 向 SP 送交短信  PSGIP_DELIVER_tag = ^TSGIP_DELIVER_tag;
      TSGIP_DELIVER_tag = packed record
        UserNumber: array[0..20] of Char; //发送短消息的用户手机号,手机号码前加"86"国别标志
        SPNumber: array[0..20] of Char; //SP的接入号码
        TP_pid: Byte; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.9
        TP_udhi: Byte; //GSM协议类型。详细解释请参考GSM03.40中的9.2.3.23,仅使用1位,右对齐
        MessageCoding: Byte; //短消息的编码格式。0:纯ASCII字符串3:写卡操作4:二进制编码8:UCS2编码15: GBK编码其它参见GSM3.38第4节:SMS Data Coding Scheme
        MessageLength: Byte; //短消息的长度
        MessageContent: array[0..MSG_LENGTH - 1] of Char; //短消息的内容
        Reserve: array[0..7] of Char; //保留,扩展用
      end;  PSGIP_DELIVER_RESP_tag = ^TSGIP_DELIVER_RESP_tag;
      TSGIP_DELIVER_RESP_tag = packed record
        Result: Byte; //Deliver命令是否成功接收。0:接收成功 其它:错误码
        Reserve: array[0..7] of Char; //保留,扩展用
      end;    ////////////////////////////////////////////////////////////////////////////
        // SMG 向 SP 送交短信 Report 状态
      PSGIP_Report_tag = ^TSGIP_Report_tag;
      TSGIP_Report_tag = packed record
        SubmitSequenceNumber: Byte; //该命令所涉及的Submit或deliver命令的序列号
        ReportType: Byte; //Report命令类型 0:对先前一条Submit命令的状态报告  1:对先前一条前转Deliver命令的状态报告
        UserNumber: array[0..20] of Char; //接收短消息的手机号,手机号码前加"86"国别标志
        State: Byte; //该命令所涉及的短消息的当前执行状态 0:发送成功 1:等待发送 2:发送失败
        ErrorCode: Byte; //当State=2时为错误码值,否则为0
        Reserve: array[0..7] of Char; //保留,扩展用
      end;    ////////////////////////////////////////////////////////////////////////////
        // SP 向 SMG   送交短信 Report 状态
      PSGIP_Report_Resp_tag = ^TSGIP_Report_RESP_tag;
      TSGIP_Report_Resp_tag = packed record
        Result: Byte; //Deliver命令是否成功接收。0:接收成功 其它:错误码
        Reserve: array[0..7] of Char; //保留,扩展用
      end;implementationend.
    //这里是读取SMG发来的Bind消息的procedure TFrame_SGIP.SGIPRead_Bind(Socket: TCustomWinSocket; SGIP_Head: tSGIP_HEAD_tag); //链接
    var
      ReadBufSize: integer;
      SGIP_Bind_StoI: tSGIP_Bind_StoI;begin
      try
        FillChar(SGIP_Bind_StoI, sizeof(tSGIP_Bind_StoI), 0);
        ReadBufSize := Socket.ReceiveBuf(SGIP_Bind_StoI, sizeof(tSGIP_Bind_StoI)+20);    if (ReadBufSize = 0) or (ReadBufSize = -1) or (ReadBufSize <> SizeOf(tSGIP_Bind_StoI) - 20) then
        begin
          RichEdit1.Lines.Add('[' + datetimetostr(now) + ']:SMG登陆SP数据包格式错误登陆失败.');
          exit;
        end;
        CxtySGIP_Bind_Save(SGIP_Bind_StoI.body.Login_Type, SGIP_Bind_StoI.body.Login_Name, SGIP_Bind_StoI.body.Login_Passowrd, SGIP_Bind_StoI.body.Reserve, 'SMG');
        //Re_Result(Socket, SGIP_BIND_RESP, 0, 'SP');
        if SGIP_Bind_StoI.body.Login_Type = 2 then//为什么这里就是不会等于2呢?
        begin
          if (SGIP_Bind_StoI.body.Login_Name = SPUsername) and (SGIP_Bind_StoI.body.Login_Passowrd = SPPWD) then
          begin
            Re_Result(Socket, SGIP_BIND_RESP, 0, 'SP');
            RichEdit1.Lines.Add('[' + datetimetostr(now) + ']:SMG登陆SP成功.');
          end
          else
          begin
            RichEdit1.Lines.Add('[' + datetimetostr(now) + ']:SMG登陆SP失败.');
          end;
          end
          else
        begin
          RichEdit1.Lines.Add('[' + datetimetostr(now) + ']:收到其他类型登陆数据.'+inttostr(SGIP_Bind_StoI.body.Login_Type));
        end;
      except
        on e: exception do
        begin
          RichEdit1.Lines.Add('[' + datetimetostr(now) + ']:SMG登陆SP失败:' + e.Message);
        end;
      end;
    end;
      

  2.   

    为什么
    SGIP_Bind_StoI.body.Login_Type
    会等于52呢???
    而且消息长度ReadBufSize 都是41而不是61?
    加了20还是41是为什么呢??小弟初学请高手指教!!!!
      

  3.   

    http://www.spzone.net上可以找到你想要的