用于网络字节打包和解包的协议数据单元pdu实现方法

文档序号:7719489阅读:134来源:国知局
专利名称:用于网络字节打包和解包的协议数据单元pdu实现方法
技术领域
本发明涉及电信业务支撑系统,尤其是在线计费系统实时Socket消息的打包、解 包技术,具体地说是一种用于网络字节打包和解包的协议数据单元PDU实现方法。
背景技术
现代电信业务支撑系统一般都由多个网元节点组成,分别完成计费、综合客服、短 信网关、语音网关、接续控制等功能,为了向最终用户提供电信业务,需要各个网元之间互 相通信,完成数据同步、业务接续控制等功能,在这样一个复杂的分布式系统中,基于TCP/ IP的网络通信需求无处不在。 传统的网络字节打包和解包需要时刻关注将各种Java数据类型转换为二进制数 据的细节,以及需要在编程时注意当前打包、解析字段的位置。这种编程方式对程序员能力 提出了较高的要求,而且极容易出错。传统的网络字节打包技术还有一个扩展性不好的问 题,那就是在增加新的网络协议时,需要重新编写打包和解包的代码。因此,这种打包和解 包的方法过于繁琐,在编程模型复杂,协议字段需要经常变更的情况下,使用不便,不能满 足简单、易扩展的要求。

发明内容
本发明的目的是针对现有的网络字节打包和解包的方法复杂、在编程模型复杂, 协议字段需要经常变更的情况下,使用不便,不能满足简单、易扩展要求的问题,提出一种 解决复杂网络编程的用于网络字节打包和解包的协议数据单元PDU实现方法。
本发明的技术方案是 —种用于网络字节打包和解包的协议数据单元PDU实现方法,它包括以下步骤
(a).定义所需传输协议的可扩展标记语言XML字段配置文件,包括传输协议中字 段的顺序、长度和数据类型; (b).打包读取该协议的字段配置文件,获得各个字段的数据类型和数据长度, 然后设置该协议各个字段的java基本类型数值,依次读取该协议的所有字段
若该字段是java基本类型,将该字段的java基本类型数值转换为字节数据;若该 字段是子包类型,读取子包的所有字段,依次打包成字节数据;遍历该协议的所有字段,得 到最终的字节数组; (c).解包获得需要解包的字节数组,根据预先读入的协议字段配置文件,取得 一个单一字段的数据长度 若该字段是的java基本数据类型,将字节数据转换为预定义的java基本数据类 型;若该字段的类型是子包类型,依次解析该子包的所有字段,得到java基本数据类型;遍 历该协议的所有字段,依次解析得到java基本数据类型。
本发明的有益效果 本发明解决了传统网络编程中存在的编程模型复杂,协议字段变更不便的问题,提供一种简单、易扩展的网络字节流打包、解包方法。 本发明提高网络字节流编程的效率,使得网络字节打包、解包变得简单;屏蔽了高 低位字节的差异,提供良好的调试信息及提供了统一的流量监控。


图1是本发明的PDU实现方法中各个对象中的关系示意图。
具体实施例方式
下面结合附图和实施例对本发明作进一步的说明。 通过XML配置文件来定义协议中字段的顺序、长度、数据类型。屏蔽原始数据类型 的复杂读写,将其自动转换为可理解的基本数据类型,实现高低位字节序随意转换,可以适 应灵活的协议配置。 如图一所示,说明了PDU实现方法中各个对象中的关系,相关名词说明如下
协议对象(Protocol):由1个或多个PDU对象组成的一个字节流抽象,可以表示 一个完整协议,比如匪L协议,SMPP协议 子包(PduBean):为了更明晰的组织协议对象,或者重用协议定义,可以使用子包 的形式来组织协议字段 协议字段对象(PduField):不可再分的PDU对象,表示一个原子的字段定义
PDU :接口定义,协议对象、子包、协议字段都实现IPdu接口,这样可以实现这样对 象之间的自包含,可认为是组件模式的一种实现。
具体实施时 以一个匪L协议的实现为例说明如何使用网络打包、解包技术实现协议的定义、 开发。
—、如协议中要求的字节如下表所示
消息开校验操作事务头会话头消息头消息长消息开
始标志和信息度始标志
二、定义协议配置文件如下 〈? xml version =〃 1.0〃 encoding =' 〈zsmart> 〈protocol> 〈bufferDefine name = 〃亂"> 〈! 一定义主消息体一〉 〈buffer id = 〃 MML_REQ =〃 MsgBeginFlag" type = 〃 5〃
消息发送顺序 UTF-8" 7 >
seq =〃 1〃 fieldname
4
length =〃 4〃 defaultValue = 〃 ' SC〃 ' comments =〃消息开始标志"/>
〈buffer id = 〃 MML_REQ〃 seq = 〃 2〃 fieldname = 〃 TotalLen" type
="5" length =〃 4〃 defaultValue = 〃 0000〃 comments =〃总长度字段"/>
〈buffer id = 〃 MML_REQ〃 seq = 〃 3〃 field謹e = 〃 msgHeader" type
="0" length =〃 4〃 defaultValue = 〃 〃 comments =〃消息头,子包〃 /> 〈buffer id = 〃匪L—REQ 〃 seq = 〃 4 〃 fieldname = 〃 MML_
SessionHeader"
头,子包
头,子包
="5"

="5"


="5"

="5"

type=〃 0〃 length =〃 4〃 defaultValue = 〃 ' SC〃 ' comments =〃会话
7 /〉
〈buffer id = 〃 MML_REQ〃 seq = 〃 5〃 field謹e = 〃 MML_transHeader〃 type=〃 0〃 length =〃 4〃 defaultValue = 〃 ' SC〃 ' comments =〃事务
7 /〉
〈buffer id=〃 MML_REQ〃 seq = 〃 6〃 fieldname = 〃 MML_CMD〃 type
length =〃 0〃 defaultValue = 〃 〃 comments = 〃匪L指令"/>
〈buffer id=〃 MML—REQ" seq = 〃 7〃 fieldname = 〃 Checksum" type
length =〃 8〃 defaultValue = 〃 9B94EDA4" comments = 〃校验和"/> 〈! 一定义消息头子包一〉
〈buffer id = 〃 msgHeader" seq = 〃 1〃 fieldname =〃 version" type
length =〃 4〃 defaultValue = 〃 1.00〃 comments =〃版本号〃 />
〈buffer id = 〃 msgHeader" seq = 〃 2〃 fieldname =〃 endFlag" type
length =〃 8〃 defaultValue = 〃 JS123456" 〈buffer id =〃 msgHeader 〃 =〃 serviceName 〃 type = 〃 5〃 length =〃 8〃 defaultValue = 〃 PPS "
〈 ! 一定义会话头子包一> 〈buffer id = 〃 亂—SessionHeader
=〃 session—id" type=〃 5〃 length = 〃 8〃 defaultValue = 话ID" /> 〈buffer seq=〃 2〃 fieldname =〃 session_control_word =〃 6〃 defaultValue = 〃 DlgCon"
comments =〃终端标志"/> seq =〃 3〃 fieldname
comments = 〃服务名〃 />
〃 seq = 〃 1 〃 fieldname
="00000000" comments ="会
id = 〃 亂—SessionHeader 〃
〃 type =〃 5〃 length
comments =〃会话控制字〃 /> 〈buffer id = 〃 MML_SessionHeader 〃 seq
=〃 session—reserved" type=〃 5〃 length = 〃 4〃 defaultValue =
留字"/> 〈 ! 一定义事务头子包一>
〈buffer id = 〃 MML_transHeader 〃 seq = id" type =〃 5〃 length =〃 8〃 defaultValue = 〃 00000001〃
〈buffer id =〃 MML_transHeader〃 seq
control—word" type=〃 5〃 length = 〃 6〃 defaultValue =
制字"/> 〈buffer id =〃 MML_transHeader〃 seq
reserved" type=〃 5〃 length = 〃 4〃 defaultValue =
留字"/> 〈 ! 一定义心跳消息一〉 〈buffer id =〃 MML_HEART〃 seq =〃 1〃 fieldname type=〃 5〃 length = 〃 4〃 defaultValue = 〃 ' SC〃 ' 开始标志"/>
fieldname
FFFF〃 comments =〃会话保
7 1 〃 fieldname = 〃 trans_
comments =〃事务ID〃 /〉 =〃 2〃 fieldname =〃 trans
TxBeg〃 comments
3〃 fieldname =〃 trans
FFFF〃 comments =〃事务保
MsgBeginFlag'
comments
消息
=〃 5'
=〃 5'
=〃 5'
〈buffer id
MML_HEART〃 seq
length =〃 4〃 defaultValue = 〈buffer id=〃匪LJEART'
length =〃 4〃 defaultValue = 〈buffer id = 〃匪LJEART''
length =〃 8〃 defaultValue = 〈/bufferDefine>
'0004' seq =
'HBHB' seq ='
2〃 fieldname =〃 TotalLen" type
comments =〃总长度字段"/> 3〃 fieldname =〃 msgBody" type
comments =〃总长度字段"/>
4〃 fieldname =〃 Checksum" type
comments
〈/zsmart>
配置文件说明
1、 bufferDesine :定义一个网络协议包
2、 buffer :定义一个单一的协议字段
3、 Id :定义此字段属于那一个子包
4、 Seq :在子包中的顺序号(在一个子包中,序号不能重复)
5、 Fieldname :字段名,在一个子包中,字段名不能重复
校验和'
6
type :相应的Java数据类型1 :Byte 2 :Short 3 :Int 4丄ong 5:String(可变 长)6 :byte[]数组7 :CString,以NULL结束的字符串 7、 length :字段长度,若是可变长的字符串,将length设为0,若字段类型是Byte, Short, Int, Long会使用Java的默认长度 8、defaultValue :默认值,可通过此字段设置字段默认值,打包时若不给此字段设 定值,将使用预定义的默认值。 由于在协议定义时已经指定了各个字段的长度和顺序,所有PDU能够根据顺序完 成自动的打包和解包。 三、在程序中引用协议对象,完成协议打包、解包。
打包过程如下 读取配置文件,获得个字段的数据类型、数据长度;设置各个字段的Java基本类 型数值;依次将各字段的java基本类型数值转换为字节数据;若该字段是子包类型,获取 改子包的所有字段,依次打包成字节数据。遍历所有字段,得到最终的字节数组。
解包过程如下 获得需要解包的字节数组,根据预先读入的协议字段配置,取得一个单一字段的
数据长度,将字节数据转换为预定义的Java基本数据类型;同样地,若该字段的类型是子
包字段,依次解析该子包的所有字段,得到java基本数据类型。遍历所有字段,依次解析得
到Java基本数据类型。 四、PDU接口编程举例 简单协议打包 〃获得匪L心跳协议定义 Protocol mmlReq = ProtocolTools. getProtocol (〃亂.亂—HEART〃 , 1); 〃设置msgBody字段值,其余值使用配置文件的默认配置 mmlReq. getPduField(" msgBody" ).setValue(" HBHB〃 ); 〃打包消息 byte [] heartBytes = mmlReq. pack (); logger, info(〃亂 Heart 〃 +heartBytes.
length+〃 Bytes 〃 +PubFimc. hexToString (heartBytes)); 〃打印协议包详细信息 logger, info (mmlReq); 上面的代码演示了使用PDU编程模型进行打包的过程,可以见到,利用PDU编程模 型框架,可以非常方便的实现协议打包。提升编程的效率。 执行结果 -匪L Heart 16Bytes 27 53 43 27 30 30 30 30 48 42 48 42 31 32 32 32 -mmlHeart : , [MsgBeginFlag, S,' SC ' , , len = 4, Hex= 27 5343 27 ], [TotalLen, S,OOOO,, len = 4, Hex = 30 30
30 30 ], [msgBody, S, HBHB, , len = 4, Hex = 48 42
48 42] , [Checksum, S, 1222, , len = 4, Hex = 31 32 32 32] 上面的输出结果显示了每一个协议字段的名称、长度、相应的java值、16进制值, 对照整个包的16进制信息,可以非常方便的获取所需要的调试信息。 本发明未涉及部分均与现有技术相同或可采用现有技术加以实现。
权利要求
一种用于网络字节打包和解包的协议数据单元PDU实现方法,其特征是它包括以下步骤(a).定义所需传输协议的可扩展标记语言XML字段配置文件,包括传输协议中字段的顺序、长度和数据类型;(b).打包读取该协议的字段配置文件,获得各个字段的数据类型和数据长度,然后设置该协议各个字段的java基本类型数值,依次读取该协议的所有字段若该字段是java基本类型,将该字段的java基本类型数值转换为字节数据;若该字段是子包类型,读取子包的所有字段,依次打包成字节数据;遍历该协议的所有字段,得到最终的字节数组;(c).解包获得需要解包的字节数组,根据预先读入的协议字段配置文件,取得一个单一字段的数据长度若该字段是的java基本数据类型,将字节数据转换为预定义的java基本数据类型;若该字段的类型是子包类型,依次解析该子包的所有字段,得到java基本数据类型;遍历该协议的所有字段,依次解析得到java基本数据类型。
全文摘要
一种用于网络字节打包和解包的协议数据单元PDU实现方法,首先定义所需传输协议的可扩展标记语言XML字段配置文件,包括传输协议中字段的顺序、长度和数据类型;然后进行打包和解包;本发明解决了传统网络编程中存在的编程模型复杂,协议字段变更不便的问题,提高了网络字节流编程的效率,使得网络字节打包、解包变得简单;屏蔽了高低位字节的差异,提供良好的调试信息及提供了统一的流量监控。
文档编号H04L29/06GK101697546SQ200910233479
公开日2010年4月21日 申请日期2009年10月30日 优先权日2009年10月30日
发明者杨学书 申请人:南京中兴软创科技股份有限公司;
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1