[0035] 以下通过特定的具体实例并结合附图说明本发明的实施方式,本领域技术人员可由本说明书所揭示的内容轻易地了解本发明的其它优点与功效。本发明亦可通过其它不同的具体实例加以施行或应用,本说明书中的各项细节亦可基于不同观点与应用,在不背离本发明的精神下进行各种修饰与变更。
[0036] 图1为本发明一种实现OMCI协议栈代码自动生成的方法的步骤流程图。如图1所示,本发明一种实现OMCI协议栈代码自动生成的方法,包括如下步骤:
[0037] 步骤101,根据ITU通信标准列出的ME(Managed entity,管理单元)对象,对ME对象进行定义申明,实现ME定义脚本的设计。在本发明具体实施里中,本步骤根据ITU-988规范标准列出的ME对象,设计一套描述该ME对象的表述方法
[0038] ME定义脚本的脚本文件是对ME对象的定义申明,ME定义包括两个部分,首先是关于该ME的全局属性的定义,其次是该ME中所有参数的属性定义。在本发明具体实施例中,不同ME按顺序排列,并且以table begin开始,以table end结尾,同个ME下的不同参数,则以attribute begin开始,以attribute end结尾。
[0039] (1)ME的全局属性如下:
[0040] ME的名称:用于生成相关函数、结构体、消息的名称;
[0041] ME最大的实例数:用于程序初始化内存时候;
[0042] ME在ITU-988标准中定义的ID(Identifier,身份标示值):用于判断ME身份;
[0043] ME支持的操作类型:在程序接收报文入口处判断是否支持相应操作;
[0044] ME用于创建的消息ID:创建该ME时候若需要通知其他系统,则使用该消息ID,若不需要则为空;
[0045] ME用于创建的消息结构体:创建该ME时候若需要通知其他系统,则使用该结构体传输数据,若不需要则为空;
[0046] ME用于删除的消息ID:删除该ME时候若需要通知其他系统,则使用该消息ID,若不需要则为空;
[0047] ME用于删除的消息结构体:删除该ME时候若需要通知其他系统,则使用该结构体,若不需要则为空;
[0048] ME用于取值的消息ID:读取该ME时候若需要从其他系统取值,则使用该消息ID,若不需要则为空;
[0049] ME用于取值的消息结构体:读取该ME时候若需要从其他系统取值,则使用该结构体,若不需要则为空;
[0050] ME用于取当前值的消息ID:读取该ME当前值时候若需要从其他系统取值,则使用该消息ID,若不需要则为空;
[0051] ME用于取当前值的消息结构体:读取该ME当前值时候若需要从其他系统取值,则使用该结构体,若不需要则为空;
[0052] ME设置回调函数;用于代码中调用,若该ME无此操作类型则为空;
[0053] ME取值回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0054] ME取当前值回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0055] ME创建回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0056] ME删除回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0057] ME手动处理标记:用于代码中调用,判断ME是否需要手动处理动作,若该ME不与其他ME相关,该标记则为空;
[0058] ME是否支持mib(Management information base,管理信息载体)上报的标记:用于生成mib上报模块代码,若该ME不支持mib上报,则为空;
[0059] 该ME通信的进程名称:用于代码中发消息时候调用。
[0060] (2)ME中参数属性如下:
[0061] 参数属性的名称:用于报文解析、参数处理部分的代码调用;
[0062] 参数的数据类型:用于判断该属性是整型值或者字符串;
[0063] 参数在内存中占用的长度:用于确定报文解析时候取值长度;
[0064] 参数是否为创建即保存标记:用于确定创建回调函数中的代码实现;
[0065] 参数设置消息ID:该属性与其他系统通信的消息ID,若该属性无设置消息接口,则为空;
[0066] 参数设置消息结构体:该属性与其他系统通信的结构体,若该属性无设置消息接口,则为空;
[0067] 参数获取消息ID:该属性与其他系统通信的消息ID,若该属性无获取消息接口,则为空;
[0068] 参数获取消息结构体:该属性与其他系统通信的结构体,若该属性无获取消息接口,则为空;
[0069] 参数是否手动处理标记:该属性报文是否需要与其他对象有关联关系,若需要手动分析,则设置该标记;
[0070] 参数默认值:该参数在初始化时候被设置成的值。
[0071] 步骤102,根据ITU通信标准申明的ME对象操作方法及属性特性,从步骤101的ME定义脚本中获取ME对象的表述来生成功能代码,实现ME功能实现脚本的设计。在本发明具体实施例中,根据ITU-988规范标准申明的ME对象操作方法及属性特性,从步骤101的ME定义脚本中获取ME对象的表述来生成功能代码。ME功能实现脚本在展开ME定义脚本过程中,会根据定义脚本中的描述来初始化脚本变量,再依次以一个完整的ME完成代码生成。
[0072] 本步骤中,ME功能实现脚本的规则主要生成以下几个文件:协议栈公用函数源码文件、协议栈ME数据库结构体定义头文件以及协议栈ME私有函数接口源文件。
[0073] 图2为本发明具体实施例中协议栈公用函数源码文件的生成示意图。如图2所示,该协议栈公用函数源码文件生成过程如下:
[0074] 步骤S21,获取所有ME列表;
[0075] 步骤S22,遍历所有ME列表;
[0076] 步骤S23,根据ME的列表索引返回该ME的最大参数个数、所有mib的初始化函数、根据ME的列表索引返回该ME信息的全局变量内存地址、根据ME的列表索引返回该ME的本地数据库可写内存地址、根据ME的列表索引返回该ME的本地数据库可读内存地址、根据ME的列表索引擦除该ME的本地数据库数据、根据ME的列表索引返回该ME的数据长度、根据ME的列表索引返回该ME的操作支持类型、用于mib上报过程的ME数据片段初始化函数。
[0077] 具体地,生成规则的文字表述为:
[0078] 1、根据ME的列表索引返回该ME的最大参数个数:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的名称宏定义,该名称宏定义即为该ME的最大参数个数,从而实现该函数返回最大参数个数函数;
[0079] 2、所有mib的初始化函数:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的初始化函数;
[0080] 3、根据ME的列表索引返回该ME信息的全局变量内存地址:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的信息全局变量内存地址函数;
[0081] 4、根据ME的列表索引返回该ME的本地数据库可写内存地址:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的本地数据库可写内存地址函数;
[0082] 5、根据ME的列表索引返回该ME的本地数据库可读内存地址:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的本地数据库可读内存地址函数;
[0083] 6、根据ME的列表索引擦除该ME的本地数据库数据:首先获取所有ME的名称列表,逐个遍历ME,同时生成擦除该ME的本地数据库数据函数;
[0084] 7、根据ME的列表索引返回该ME的数据长度:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME数据长度读取函数;
[0085] 8、根据ME的列表索引返回该ME的操作支持类型:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME支持的操作类型;
[0086] 9、用于mib上报过程的ME数据片段初始化函数:首先获取所有ME的名称列表,逐个遍历ME,同时生成所有ME的数据片段读取函数;
[0087] 图3为本发明具体实施例中协议栈ME数据库结构体定义头文件的生成示意图。该文件中根据ITU-988规范申明了所有ME的结构体,如图3所示,协议栈ME数据库结构体定义头文件的生成过程如下:
[0088] 步骤S31,获取ME定义脚本中关于该ME的名称,用于申明该结构体名称;
[0089] 步骤S32,循环遍历该ME所有的参数属性,依次判断该参数属性的数据类型。
[0090] 步骤S33,若为无符号字符型的参数,则代码生成以无符号字符型定义该属性;若为无符号短整型的参数,则代码生成以无符号短整型定义该属性;若为无符号整型的参数,则代码生成以无符号整型定义该属性;若为字符串类型的参数,则代码生成以字符串类型定义该属性
[0091] 步骤S34,返回步骤S32,直到该ME所有的参数遍历完毕。
[0092] 图4为本发明具体实施例中协议栈ME私有函数接口源文件的生成示意图。在本发明中,协议栈ME私有函数接口源文件是以ME为区分,每个ME都有一个对应的私有函数接口源文件,且文件名称包含该ME名称。该文件包含的函数主要有ME设置回调函数、ME取值回调函数、ME创建回调函数、ME删除回调函数、OMCI报文转ME参数函数、按ME参数掩码发消息函数。如图4所示,协议栈ME私有函数接口源文件的生成规则如下:
[0093] 1)获取ME定义脚本中该ME的名称、参数个数、参数手动处理标记、ME手动处理标记、消息ID、消息结构体、ME通信进程名称;
[0094] 2)生成ME取值回调函数:遍历ME表,即根据参数个数,循环遍历所有参数,每个参数都拥有自己的掩码作为执行条件,若成立再判断该参数的数据类型,根据无符号字符型、无符号短整型、无符号整形、字符串类型的不同长度,将数据库中参数值拷贝到一段内存中,组成回复的OMCI报文;
[0095] 3)生成OMCI报文转ME参数函数:遍历ME表,即根据参数个数,循环遍历所有参数,每个参数都拥有自己的掩码作为执行条件,若成立再判断该参数的数据类型,根据无符号字符型、无符号短整型、无符号整形、字符串类型分别做不同长度的内存拷贝动作,实现OMCI报文内容到ME参数值的转换。
[0096] 4)生成按ME参数掩码发消息函数:遍历ME表,即根据参数个数,循环遍历所有参数,每个参数都拥有自己的掩码作为执行条件,若成立再判断是否支持手动处理,若支持手动处理则生成手动处理函数,若不支持则使用该参数的消息ID和ME通信进程名称进行消息的发送。
[0097] 5)生成ME设置回调函数:先调用OMCI报文转ME参数函数,把协议栈收到的报文转化为ME参数;再调用参数保存函数,将ME参数保存到数据库;然后判断ME手动处理标记是否有效,有效则调用ME手动处理函数,无效则此时无需做处理;最后调用参数设置消息发送函数与其他系统通信,该参数设置消息发送函数用于将设置参数更改的事件通告给其他系统的消息函数;
[0098] 6)生成ME创建回调函数:首先判断ME创建回调函数标记是否有效,若无效则调用ME删除回调函数,有效则调用OMCI报文转ME参数函数,把协议栈收到的报文转化为ME参数;再调用参数保存函数,将ME参数保存到数据库;然后判断ME手动处理函数标记是否有效,有效则调用ME手动创建函数,无效则调用参数创建消息发送函数,该参数创建消息发送函数用于将创建ME的事件通告给其他系统的消息函数;
[0099] 7)生成ME删除回调函数:调用OMCI报文转ME参数函数,把协议栈收到的报文转化为ME参数;然后判断ME手动处理函数标记是否有效,有效则调用ME手动删除函数,无效则调用参数删除消息发送函数,该参数删除消息发送函数用于将删除ME的事件通告给其他系统的消息函数;
[0100] 步骤103,采用ME定义脚本和ME功能实现脚本协同的方式,实现OMCI协议栈代码的自动生成。
[0101] 在本发明具体实施例中,本发明之实现OMCI协议栈代码自动生成的方法利用TCL脚本技术,采用ME定义脚本和ME功能实现脚本协同的方式,实现OMCI协议栈代码的自动生成,这样开发人员只需要维护ME定义脚本和ME功能实现脚本这两个文件即可,可大大减少了人为写代码的工作量,且便于后续的维护及调试。
[0102] 图5为本发明一种实现OMCI协议栈代码自动生成的系统的系统架构图。如图5所示,本发明一种实现OMCI协议栈代码自动生成的系统,包括:ME定义脚本设计单元501、ME功能实现脚本设计单元502以及代码自动生成单元503。
[0103] ME定义脚本设计单元501,用于根据ITU通信标准列出的ME(Managed entity,管理单元)对象,对ME对象进行定义申明,实现ME定义脚本的设计。在本发明具体实施里中,ME定义脚本设计单元501根据ITU-988规范标准列出的ME对象,设计一套描述该ME对象的表述方法
[0104] ME定义脚本的脚本文件是对ME对象的定义申明,ME定义包括两个部分,首先是关于该ME的全局属性的定义,其次是该ME中所有参数的属性定义。在本发明具体实施例中,不同ME按顺序排列,并且以table begin开始,以table end结尾,同个ME下的不同参数,则以attribute begin开始,以attribute end结尾。
[0105] (1)ME的全局属性如下:
[0106] ME的名称:用于生成相关函数、结构体、消息的名称;
[0107] ME最大的实例数:用于程序初始化内存时候;
[0108] ME在ITU-988标准中定义的ID(Identifier,身份标示值):用于判断ME身份;
[0109] ME支持的操作类型:在程序接收报文入口处判断是否支持相应操作;
[0110] ME用于创建的消息ID:创建该ME时候若需要通知其他系统,则使用该消息ID,若不需要则为空;
[0111] ME用于创建的消息结构体:创建该ME时候若需要通知其他系统,则使用该结构体传输数据,若不需要则为空;
[0112] ME用于删除的消息ID:删除该ME时候若需要通知其他系统,则使用该消息ID,若不需要则为空;
[0113] ME用于删除的消息结构体:删除该ME时候若需要通知其他系统,则使用该结构体,若不需要则为空;
[0114] ME用于取值的消息ID:读取该ME时候若需要从其他系统取值,则使用该消息ID,若不需要则为空;
[0115] ME用于取值的消息结构体:读取该ME时候若需要从其他系统取值,则使用该结构体,若不需要则为空;
[0116] ME用于取当前值的消息ID:读取该ME当前值时候若需要从其他系统取值,则使用该消息ID,若不需要则为空;
[0117] ME用于取当前值的消息结构体:读取该ME当前值时候若需要从其他系统取值,则使用该结构体,若不需要则为空;
[0118] ME设置回调函数;用于代码中调用,若该ME无此操作类型则为空;
[0119] ME取值回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0120] ME取当前值回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0121] ME创建回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0122] ME删除回调函数:用于代码中调用,若该ME无此操作类型则为空;
[0123] ME手动处理标记:用于代码中调用,判断ME是否需要手动处理动作,若该ME不与其他ME相关,该标记则为空;
[0124] ME是否支持mib(Management information base,管理信息载体)上报的标记:用于生成mib上报模块代码,若该ME不支持mib上报,则为空;
[0125] 该ME通信的进程名称:用于代码中发消息时候调用。
[0126] (2)ME中参数属性如下:
[0127] 参数属性的名称:用于报文解析、参数处理部分的代码调用;
[0128] 参数的数据类型:用于判断该属性是整型值或者字符串;
[0129] 参数在内存中占用的长度:用于确定报文解析时候取值长度;
[0130] 参数是否为创建即保存标记:用于确定创建回调函数中的代码实现;
[0131] 参数设置消息ID:该属性与其他系统通信的消息ID,若该属性无设置消息接口,则为空;
[0132] 参数设置消息结构体:该属性与其他系统通信的结构体,若该属性无设置消息接口,则为空;
[0133] 参数获取消息ID:该属性与其他系统通信的消息ID,若该属性无获取消息接口,则为空;
[0134] 参数获取消息结构体:该属性与其他系统通信的结构体,若该属性无获取消息接口,则为空;
[0135] 参数是否手动处理标记:该属性报文是否需要与其他对象有关联关系,若需要手动分析,则设置该标记
[0136] 参数默认值:该参数在初始化时候被设置成的值。
[0137] ME功能实现脚本设计单元502,用于根据ITU通信标准申明的ME对象操作方法及属性特性,从ME定义脚本设计单元501的ME定义脚本中获取ME对象的表述来生成功能代码,实现ME功能实现脚本的设计。在本发明具体实施例中,ME功能实现脚本设计单元502根据ITU-988规范标准申明的ME对象操作方法及属性特性,从ME定义脚本设计单元501的ME定义脚本中获取ME对象的表述来生成功能代码。ME功能实现脚本在展开ME定义脚本过程中,会根据定义脚本中的描述来初始化脚本变量,再依次以一个完整的ME完成代码生成。
[0138] ME功能实现脚本的规则主要生成以下几个文件:协议栈公用函数源码文件、协议栈ME数据库结构体定义头文件以及协议栈ME私有函数接口源文件。
[0139] 该协议栈公用函数源码文件中均为协议栈公用的函数,包括根据ME的列表索引返回该ME的最大参数个数、所有mib的初始化函数、根据ME的列表索引返回该ME信息的全局变量内存地址、根据ME的列表索引返回该ME的本地数据库可写内存地址、根据ME的列表索引返回该ME的本地数据库可读内存地址、根据ME的列表索引擦除该ME的本地数据库数据、根据ME的列表索引返回该ME的数据长度、根据ME的列表索引返回该ME的操作支持类型、用于mib上报过程的ME数据片段初始化函数。具体地,该协议栈公用函数源码文件生成规则如下:
[0140] 1、根据ME的列表索引返回该ME的最大参数个数:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的名称宏定义,该名称宏定义即为该ME的最大参数个数,从而实现该函数返回最大参数个数函数;
[0141] 2、所有mib的初始化函数:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的初始化函数;
[0142] 3、根据ME的列表索引返回该ME信息的全局变量内存地址:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的信息全局变量内存地址函数;
[0143] 4、根据ME的列表索引返回该ME的本地数据库可写内存地址:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的本地数据库可写内存地址函数;
[0144] 5、根据ME的列表索引返回该ME的本地数据库可读内存地址:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME的本地数据库可读内存地址函数;
[0145] 6、根据ME的列表索引擦除该ME的本地数据库数据:首先获取所有ME的名称列表,逐个遍历ME,同时生成擦除该ME的本地数据库数据函数;
[0146] 7、根据ME的列表索引返回该ME的数据长度:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME数据长度读取函数;
[0147] 8、根据ME的列表索引返回该ME的操作支持类型:首先获取所有ME的名称列表,逐个遍历ME,同时生成具体ME支持的操作类型;
[0148] 9、用于mib上报过程的ME数据片段初始化函数:首先获取所有ME的名称列表,逐个遍历ME,同时生成所有ME的数据片段读取函数;
[0149] 协议栈ME数据库结构体定义头文件根据ITU-988规范申明了所有ME的结构体,其生成规则如下:
[0150] 1、获取ME定义脚本中关于该ME的名称,用于申明该结构体名称;
[0151] 2、循环遍历该ME所有的参数属性,依次判断该参数属性的数据类型。
[0152] 3、若为无符号字符型的参数,则代码生成以无符号字符型定义该属性;若为无符号短整型的参数,则代码生成以无符号短整型定义该属性;若为无符号整型的参数,则代码生成以无符号整型定义该属性;若为字符串类型的参数,则代码生成以字符串类型定义该属性,直到该ME所有的参数遍历完毕。
[0153] 在本发明中,协议栈ME私有函数接口源文件是以ME为区分,每个ME都有一个对应的私有函数接口源文件,且文件名称包含该ME名称。该文件包含的函数主要有ME设置回调函数、ME取值回调函数、ME创建回调函数、ME删除回调函数、OMCI报文转ME参数函数、按ME参数掩码发消息函数。具体地,协议栈ME私有函数接口源文件的生成规则如下:
[0154] 1)获取ME定义脚本中该ME的名称、参数个数、参数手动处理标记、ME手动处理标记、消息ID、消息结构体、ME通信进程名称;
[0155] 2)生成ME取值回调函数:遍历ME表,即根据参数个数,循环遍历所有参数,每个参数都拥有自己的掩码作为执行条件,若成立再判断该参数的数据类型,根据无符号字符型、无符号短整型、无符号整形、字符串类型的不同长度,将数据库中参数值拷贝到一段内存中,组成回复的OMCI报文;
[0156] 3)生成OMCI报文转ME参数函数:遍历ME表,即根据参数个数,循环遍历所有参数,每个参数都拥有自己的掩码作为执行条件,若成立再判断该参数的数据类型,根据无符号字符型、无符号短整型、无符号整形、字符串类型分别做不同长度的内存拷贝动作,实现OMCI报文内容到ME参数值的转换。
[0157] 4)生成按ME参数掩码发消息函数:遍历ME表,即根据参数个数,循环遍历所有参数,每个参数都拥有自己的掩码作为执行条件,若成立再判断是否支持手动处理,若支持手动处理则生成手动处理函数,若不支持则使用该参数的消息ID和ME通信进程名称进行消息的发送。
[0158] 5)生成ME设置回调函数:先调用OMCI报文转ME参数函数,把协议栈收到的报文转化为ME参数;再调用参数保存函数,将ME参数保存到数据库;然后判断ME手动处理标记是否有效,有效则调用ME手动处理函数,无效则此时无需做处理;最后调用参数设置消息发送函数与其他系统通信,该参数设置消息发送函数用于将设置参数更改的事件通告给其他系统的消息函数;
[0159] 6)生成ME创建回调函数:首先判断ME创建回调函数标记是否有效,若无效则调用ME删除回调函数,有效则调用OMCI报文转ME参数函数,把协议栈收到的报文转化为ME参数;再调用参数保存函数,将ME参数保存到数据库;然后判断ME手动处理函数标记是否有效,有效则调用ME手动创建函数,无效则调用参数创建消息发送函数,该参数创建消息发送函数用于将创建ME的事件通告给其他系统的消息函数;
[0160] 7)生成ME删除回调函数:调用OMCI报文转ME参数函数,把协议栈收到的报文转化为ME参数;然后判断ME手动处理函数标记是否有效,有效则调用ME手动删除函数,无效则调用参数删除消息发送函数,该参数删除消息发送函数用于将删除ME的事件通告给其他系统的消息函数;
[0161] 代码自动生成单元503,用于采用ME定义脚本和ME功能实现脚本协同的方式,实现OMCI协议栈代码的自动生成。
[0162] 综上所述,本发明一种实现OMCI协议栈代码自动生成的方法及系统通过设计ME定义脚本和ME功能实现脚本,采用ME定义脚本和ME功能实现脚本协同的方式,实现了OMCI协议栈代码的自动生成,使得开发人员只需要维护ME定义脚本和ME功能实现脚本这两个文件,大大减少了人为写代码的工作量,且便于后续的维护及调试。
[0163] 任何本领域技术人员均可在不违背本发明的精神及范畴下,对上述实施例进行修饰与改变。因此,本发明的权利保护范围,应如权利要求书所列。