请教SGIP1.2的问题!

cxty 2005-04-25 09:27:04
我用Delphi写SGIP1.2的SP端

为什么在模拟器中SMG登陆SP的时候Login_Type会等于52而不是2呢???

高手请指教~
一下是SGIP的协议部分请高手指教!谢谢!
unit SGIP_Protocol12;

interface

const

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;
...全文
194 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
westfly 2005-04-27
  • 打赏
  • 举报
回复
你的编码有问题/应该先把收到的数据先缓存到流中/满一个包的长度后再进行解析
cxty 2005-04-26
  • 打赏
  • 举报
回复
没人啦!!!!!
cxty 2005-04-26
  • 打赏
  • 举报
回复
多谢!!!
fengzhengren 2005-04-26
  • 打赏
  • 举报
回复
帮顶。
cxty 2005-04-26
  • 打赏
  • 举报
回复
有在那提问咯!没人回答!寒啦~~~~~
itlcx 2005-04-26
  • 打赏
  • 举报
回复
http://www.spzone.net上可以找到你想要的
cxty 2005-04-25
  • 打赏
  • 举报
回复
为什么
SGIP_Bind_StoI.body.Login_Type
会等于52呢???
而且消息长度ReadBufSize 都是41而不是61?
加了20还是41是为什么呢??

小弟初学请高手指教!!!!
cxty 2005-04-25
  • 打赏
  • 举报
回复

////////////////////////////////////////////////////////////////////////////
// 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;

implementation

end.




//这里是读取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;
1.接口说明
该接口库是用VC6.0开发的基于Windows平台上的SGIP1.2协议的实现,接口对中国联通SGIP协议进行了高度封装,目的是方便SP接入中国联通短消息网关。
2.功能特点
1)严格按照SGIP1.2协议实现,支持Bind、BindResp、Submit、SubmitResp、Deliver、DeliverResp、Report、ReportResp、Unbind、UnbindResp消息。
2)采用多线程并发处理的方式获取强大的性能,针对SGIP协议的特点,内建线程池进行消息的收发及处理操作,充分发挥系统和网络性能,再大的业务量也能够得到及时处理,丢包率小于0.01/%。
3)发送消息采用短连接的方式;接收消息采用半长连接的方式,可以设置超时时间,在没有消息的情况下,主动断开网关连接。
4)接口库经过高度封装,模块化强,使用简单,屏蔽了网关通信,消息收发和处理的复杂性操作,SP用户只需要关注具体的业务处理过程,大大简化了短消息开发的难度!
5)利用内建的线程池,可以大幅度提高SP短消息收发的速度,同时也能提高SP业务处理的速度。
6)以最方便灵活的方式支持短消息群发功能。
7)可以很方便地连接多个网关。
3.接口使用
该接口库以动态库的形式提供,包含以下三个文件:sgip.h, sgip.lib, SGIP.DLL.在动态库中导出了CSgip类,只需要调用三个函数就可以完成短消息收发的全部工作(Start,Submit,Release),每一个CSgip类可以用来连接一个网关,因此生成多个CSgip类就可以达到连接多个网关的目的。

1,593

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 网络通信/分布式开发
社区管理员
  • 网络通信/分布式开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧