掌桥专利:专业的专利平台
掌桥专利
首页

一种嵌入式系统进程间大数据通信的方法及装置

文献发布时间:2023-06-19 10:05:17


一种嵌入式系统进程间大数据通信的方法及装置

技术领域

本发明涉及嵌入式技术领域,特别涉及一种嵌入式系统进程间大数据通信的方法及装置。

背景技术

目前嵌入式系统中,一般进程间通信通常采用无名管道(pipe)、高级管道(popen)、有名管道(named pipe)、消息队列(message queue)、信号量(semophore)、信号(signal)、共享内存(shared memory)及套接字(socket)等的方式进行通信。但是,这些现有技术中往往存在着:

通信量比较小,如果进行大数据通信的话,需要长时间占用系统CPU资源进行消息传递,导致系统CPU占有率过高从而影响整个嵌入式系统的性能;

通信基本是两个进程间进行通信,如果多个进程间对同一消息处理的话,需要转发多次,导致效率低下;

通信时数据发送端要将申请合适内存并进行数据解析并封装成消息,接收端要解封消息并解析数据,才能使用,最后释放内存,导致CPU处理及内存负荷加重,在嵌入式系统中,这些资源都是比价珍贵的;

通信的内容都是在嵌入式内存中进行,掉电不能保存,导致不能查看系统相关接口及连接的设备在掉电之前的状态信息。

因此,现有技术中迫切地需要一种嵌入式系统进程间大数据通信的方法及装置。主要解决目前进程间通信大数据时占用CPU及DDR资源多,占用CPU时间长的问题;解决进程间高效进行大数据通信,多个进程不能进行同时通信,以及通信数据不能断电保存的问题。

发明内容

(一)发明目的

为克服上述现有技术存在的至少一种缺陷,本发明提供了一种嵌入式系统进程间大数据通信的方法及装置,解决目前进程间通信数据时占用CPU及DDR资源多,占用CPU时间长的问题;使得进程间能够进行高效的大数据通信,多个进程能够同时通信,以及通信数据可以断电保存。

(二)技术方案

作为本发明的第一方面,本发明公开了一种嵌入式系统进程间大数据通信的方法,包括以下步骤:

初始化步骤,在嵌入式启动时对通信数据库文件及其相关数据表项进行分析处理;

通信数据更新步骤,将待更新的所述数据表项更新到通信数据库相对应的所述数据表项中;

通信数据读取步骤,在有一个或多个进程时,读取所述通信数据库中若干所述数据表项中的数据;

通信数据保存步骤,在达到预设条件时,将内存中的所述通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。

一种可能的实施方式中,所述初始化步骤包括:初始化数据通信步骤、判断读写权限步骤、建立读写权限步骤、建立业务数据步骤、其它需求建立步骤和初始化inotify监控步骤;

所述初始化步骤,判断所述通信数据库文件及其相关数据表项是否存在,若存在,则执行所述初始化inotify监控步骤,若不存在,则执行所述初始化数据通信步骤;

所述初始化数据通信步骤,判断所述Flash或其它非易失性的存储器中是否存在所述通信数据库文件,若存在,则将所述Flash或其它非易失性的存储器中的所述通信数据库文件存到内存指定的文件路径下,从而在判断出所述通信数据库不存在时,建立所述通信数据库;若不存在,则自动建立所述通信数据库;

所述判断读写权限步骤,判断读写权限表是否存在,若否,则执行所述建立读写权限步骤;

所述建立读写权限步骤,在所述通信数据库中建立所述读写权限表,以便对所述通信数据库进行互斥机制加以保护,对共享资源进行互斥访问;

所述建立业务数据步骤,在业务数据表不存在时,创建所述业务数据表;

所述其它需求建立步骤,分析所述业务数据表的其它需求,并建立其它需求表;

所述初始化inotify监控步骤,将所述通信数据库的所述文件路径以及所述通信数据库文件加入到inotify进行监测。

一种可能的实施方式中,所述业务数据表包括:ONU配置管理表、接口配置管理表、VLAN配置管理表、路由配置管理表和ACL配置管理表。

一种可能的实施方式中,所述通信数据更新步骤,判断所述通信数据库的表项SmuxTableKey中WriteFlag是否为能合法写,若是,则更新所述WriteFlag为写占用;

完成写数据库操作后,将所述WriteFlag更新到写空闲,释放写权限至其它所述进程,以使得其它所述进程执行所述写数据库操作。

一种可能的实施方式中,所述预设条件包括:预设时长和/或通信数据库存在更新。

作为本发明的第二方面,本发明公开了一种嵌入式系统进程间大数据通信的装置,包括:

初始化模块,用于在嵌入式启动时对通信数据库文件及其相关数据表项进行分析处理;

通信数据更新模块,用于将待更新的所述数据表项更新到通信数据库相对应的所述数据表项中;

通信数据读取模块,用于在有一个或多个进程时,读取所述通信数据库中若干所述数据表项中的数据;

通信数据保存模块,用于在达到预设条件时,将内存中的所述通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。

一种可能的实施方式中,所述初始化模块包括:初始化数据通信单元、判断读写权限单元、建立读写权限单元、建立业务数据单元、其它需求建立单元和初始化inotify监控单元;

所述初始化模块,用于判断所述通信数据库文件及其相关数据表项是否存在,若存在,则执行所述初始化inotify监控单元,若不存在,则执行所述初始化数据通信单元;

所述初始化数据通信单元,用于判断所述Flash或其它非易失性的存储器中是否存在所述通信数据库文件,若存在,则将所述Flash或其它非易失性的存储器中的所述通信数据库文件存到内存指定的文件路径下,从而在判断出所述通信数据库不存在时,建立所述通信数据库;若不存在,则自动建立所述通信数据库;

所述判断读写权限单元,用于判断读写权限表是否存在,若否,则执行所述建立读写权限单元;

所述建立读写权限单元,用于在所述通信数据库中建立所述读写权限表,以便对所述通信数据库进行互斥机制加以保护,对共享资源进行互斥访问;

所述建立业务数据单元,用于在业务数据表不存在时,创建所述业务数据表;

所述其它需求建立单元,用于分析所述业务数据表的其它需求,并建立其它需求表;

所述初始化inotify监控单元,用于将所述通信数据库的所述文件路径以及所述通信数据库文件加入到inotify进行监测。

一种可能的实施方式中,所述业务数据表包括:ONU配置管理表、接口配置管理表、VLAN配置管理表、路由配置管理表和ACL配置管理表。

一种可能的实施方式中,所述通信数据更新模块,用于判断所述通信数据库的表项SmuxTableKey中WriteFlag是否为能合法写,若是,则更新所述WriteFlag为写占用;

完成写数据库操作后,将所述WriteFlag更新到写空闲,释放写权限至其它所述进程,以使得其它所述进程执行所述写数据库操作。

一种可能的实施方式中,所述预设条件包括:预设时长和/或通信数据库存在更新。

(三)有益效果

本发明提供的一种嵌入式系统进程间大数据通信的方法及装置,通过初始化步骤在嵌入式启动时对通信数据库文件及其相关数据表项进行分析处理,通信数据更新步骤将待更新的所述数据表项更新到通信数据库相对应的所述数据表项中,通信数据读取步骤在有一个或多个进程时,读取所述通信数据库中若干所述数据表项中的数据,通信数据保存步骤在达到预设条件时,将内存中的所述通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。能够解决目前进程间通信数据时占用CPU及DDR资源多,占用CPU时间长的问题;使得进程间能够进行高效的大数据通信,多个进程能够同时通信,以及通信数据可以断电保存。

附图说明

以下参考附图描述的实施例是示例性的,旨在用于解释和说明本发明,而不能理解为对本发明的保护范围的限制。

图1是本发明提供的一种嵌入式系统进程间大数据通信的方法的流程图。

图2是本发明提供的一种嵌入式系统进程间大数据通信的装置的结构示意图。

具体实施方式

为使本发明实施的目的、技术方案和优点更加清楚,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行更加详细的描述。

需要说明的是:在附图中,自始至终相同或类似的标号表示相同或类似的元件或具有相同或类似功能的元件。所描述的实施例是本发明一部分实施例,而不是全部的实施例,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

在本发明的描述中,需要理解的是,术语“中心”、“纵向”、“横向”、“前”、“后”、“左”、“右”、“竖直”、“水平”、“顶”、“底”、“内”、“外”等指示的方位或位置关系为基于附图所示的方位或位置关系,均仅是为了便于描述本发明和简化描述,而不是指示或暗示所指的装置或元件必须具有特定的方位、以特定的方位构造和操作,因此不能理解为对本发明保护范围的限制。

下面参考图1详细描述本发明提供的一种嵌入式系统进程间大数据通信的方法的第一实施例。如图1所示,本实施例提供的进程间大数据通信的方法主要包括有:初始化步骤、通信数据更新步骤、通信数据读取步骤和通信数据保存步骤。

本发明属于嵌入式领域,主要解决目前进程间通信数据占用CPU及DDR资源多,占用CPU时间长的问题。譬如在GPON OLT(以16口PON口产品为例)产品中,每个PON口能按标准是可以管理128个ONU,16口PON需要管理2048个ONU,每个ONU按ITU G.988的标准配置管理项达到1000项以上,按平均每个配置管理项4个字节,则整个16口GPON OLT光管理ONU数据达到8M左右;对于嵌入式系统而言,这是个庞大的数据,进程间通信数据转移(譬如从PON管理进程到命令行进程),数据打包、数据传送和数据分析等是一个占用资源多、耗时及低效的过程。

初始化步骤,在嵌入式启动时对通信数据库文件及其相关数据表项进行分析处理;

其中,所述初始化步骤包括:初始化数据通信步骤、判断读写权限步骤、建立读写权限步骤、建立业务数据步骤、其它需求建立步骤和初始化inotify监控步骤;

所述初始化步骤,判断所述通信数据库文件及其相关数据表项是否存在,若存在,则执行所述初始化inotify监控步骤,若不存在,则执行所述初始化数据通信步骤;

所述初始化数据通信步骤,当嵌入式系统启动到第一个用户应用进程时,首先判断所述Flash或其它非易失性的存储器中是否存在所述通信数据库文件,若存在,则将所述Flash或其它非易失性的存储器中的所述通信数据库文件存到内存指定的文件路径下,从而在使用int sqlite3_open(const char *filename, sqlite3 **ppDb)判断出所述通信数据库不存在时,建立所述通信数据库,该函数打开一个指向 SQLite 通信数据库文件的连接,返回一个用于通信数据库文件句柄。参数“const char *filename”是通信数据库文件名;通信数据库文件不需要一定存在;若不存在,则通过sqlite自动建立所述通信数据库;参数“sqlite3 **ppDb”为关键数据结构。如果sqlite通信数据库被成功打开(或创建),将会返回成功(0),否则将会返回错误码;同时ppDb参数在通信数据库连接句柄被返回到这个参数,即使发生错误,唯一的一次是如果sqlite不能分配内存来存放sqlite对象,ppDb将会被返回一个NULL值。

如果通信数据库打开(或创建)失败,或者ppDb返回为NULL值,则表示初始化失败,将产生严重告警并停止往下运行程序,等待维护技术人员进行排查故障。

所述判断读写权限步骤,判断读写权限表是否存在,若否,则执行所述建立读写权限步骤;可在通信数据库中,建立一个读写权限表,该读写权限表的表名为ProcCommMuxTable,包含如下字段:

SmuxTableKey,//该读写权限表的“主关键字”,主关键字用于唯一索引读写权限表内的某一条记录,主关键字必须唯一且主关键字的列值不能为空。

WriteMuxFlag, //写权限标识位,0表示写空闲,1表示写占用,本发明中,只能有一个进程在写空闲(0)的时候在置位写占用(1)进行写操作数据库。

WritePIDID, //写操作进程ID,表示本发明使用的设备中软件当前写操作此通信数据库的进程ID。

WritePIDName, //写操作进程名称,表示本发明使用的设备中软件当前写操作此通信数据库的进程名称。

ReadFlag, //读权限标识位,0表示写空闲,1表示写占用,本发明中,多个进程可以同时读操作数据库,即使写操作为1;此为预留为今后所用。

ReadPIDID, //读操作进程ID,表示本发明使用的设备中软件当前读操作此通信数据库的进程ID;此为预留为今后所用。

ReadPIDName //读操作进程名称,表示本发明使用的设备中软件当前读操作此通信数据库的进程名称;此为预留为今后所用。

接上述初始化数据通信步骤,首先通过sqlite3_exec(sqlite3 *ppDb, constchar *sql, int (*callback)(void*,int,char**,char**), void *data, char **errmsg) 函数来判断读写权限表是否存在,其中参数sqlite3 *ppDb为上述初始化数据通信步骤返回的通信数据库连接句柄,const char *sql表示相应的sql语句,int (*callback)(void*,int,char**,char**)表示sql语句对应的回调函数,void *data表示传递给回调函数的指针参数,char **errmsg表示函数执行错误时返回的错误信息。

其中sql参数为“SELECT * FROM ProcCommMuxTable”,返回成功表示读写权限表存在,返回错误表示读写权限表不存在。

所述建立读写权限步骤,在所述通信数据库中建立所述读写权限表,以便对所述通信数据库进行互斥机制加以保护,对共享资源进行互斥访问;可通过sqlite3_exec(sqlite3 *ppDb, const char *sql, int (*callback)(void*,int,char**,char**),void *data, char **errmsg) 函数来创建读写权限表,其中sql参数为“CREATE TABLEProcCommMuxTable (" \

"SmuxTableKey INT PRIMARY KEY NOT NULL," \

"WriteFlag INT NOT NULL," \

"WritePIDID INT NOT NULL," \

"WritePIDName CHAR(32)," \

"ReadFlag INT NOT NULL," \

"ReadPIDID INT NOT NULL," \

"ReadPIDName CHAR(32)," );"

返回成功表示读写权限表创建成功,返回错误则产生严重告警并停止往下运行程序,等待维护技术人员进行排查故障。

若读写权限表创建成功,同理使用上面sqlite3_exec函数及sql参数"INSERTINTO ProcCommMuxTable (SmuxTableKey, WriteFlag, WritePIDID, WritePIDName,ReadFlag, ReadPIDID,ReadPIDName) "\

"VALUES (0x5A334F53, 0, 0, ‘’, 0, 0, ‘’); ",将读写权限表数据进行初始化。

所述建立业务数据步骤,在业务数据表不存在时,创建所述业务数据表;

其中,所述业务数据表包括:ONU配置管理表、接口配置管理表、VLAN配置管理表、路由配置管理表和ACL配置管理表。例如用在GPON OLT的ONU的业务数据表的字段包含几十项,所述业务数据表的GPON_ONU_Table至少包含如下字段:

(" \

"ONUIndexKey INT PRIMARY KEY NOT NULL," \ //主键,主键不能够重复, 一般把主键名设为"id", 不需要赋值, 会自增。

"ONU_ID INT NOT NULL," \ //表示ONU的ID。

"SN CHAR(12) NOT NULL," \ //表示GPON ONU的Searial Number,识别ONU。

"MACAddr CHAR(6) NOT NULL," \ //ONU MAC地址。

"LOID CHAR(32)," \ //ONU的逻辑ID。

" PASS CHAR(32)," \ //ONU的逻辑密码。

"Status INT," \ //ONU状态(O1~O7),对应GPON标准的7个状态。

"VendorID CHAR(32)," \ //ONU的设备提供商ID。

"HWVersion CHAR(32)," \ //ONU的硬件版本。

"SWVersion CHAR(32)," \ //ONU的软件版本。

"EquipID CHAR(32)," \ //ONU的设备ID。

"OnlineTime CHAR(32)," \ //ONU的上线时间。

"OfflineTime CHAR(32)," \ //ONU的下线时间。

"RxPower INT," \ //ONU的PON口光接收功率。

"TxPower INT);" //ONU的PON口光发送功率。

所述其它需求建立步骤,分析所述业务数据表的其它需求(所述其它需求即为其它实际产品的需求),并建立其它需求表,譬如GPON OLT中对Vlan的配置管理表,对端口的配置管理表等,都可建立相应的数据表项。

所述初始化inotify监控步骤,将所述通信数据库的所述文件路径以及所述通信数据库文件加入到inotify进行监测。

在本步骤中,可执行初始化inotify监控文件动作:通过inotify_init()创建一个inotify实例,此函数返回文件操作句柄,供后面函数使用。通过inotify_add_watch(intfd, const char *pathname, uint32_t mask) 将通信数据库的文件路径及通信数据库文件加入到inotify进行监测(使用const char *pathname参数),参数uint32_t mask即为监控的动作有IN_ACCESS(通信数据库文件被访问),IN_ATTRIB(通信数据库文件属性发生变化),IN_CLOSE_WRITE(以write方式打开通信数据库文件并关闭),IN_CLOSE_NOWRITE(以非write方式打开通信数据库文件并关闭),IN_CREATE(通信数据库文件或目录被创建),IN_DELETE(通信数据库文件或目录被删除),IN_DELETE_SELF (被监测的通信数据库文件或目录被删除),IN_MODIFY(通信数据库文件被修改),IN_MOVE_SELF(被监测的通信数据库文件或目录移动),IN_MOVED_FROM(通信数据库文件移出被监测的目录),IN_MOVED_TO(通信数据库文件移入被监测的目录),IN_OPEN (通信数据库文件被打开)。

inotify是一个内核用于通知用户空间程序文件系统变化的机制,监控通信数据库文件原理为:inotify机制借用了内核里面的notify通知链技术,针对文件系统里面的使用,主要是在inode结构体里面加入了相关的字段;每新建一个inotify实例,内核都会分配一个fsnotify_group;当有事件被监控到了以后的执行流程将把事件挂入到组中的notification队列中,唤醒等待队列,并根据inotify_add_watch函数mask传入的产生发送信号通知应用层。

其中,所述通信数据更新步骤,在通信数据库及通信数据库文件inotify初始化成功后,即可被各个进程进行调用使用,当某个进程(譬如PIDA)需要更新通信数据库,首先判断所述通信数据库的表项SmuxTableKey中WriteFlag是否为能合法写(0),若是,则更新所述WriteFlag为写占用(1);

此时将待更新(包括加、改、删操作)的所述数据表项更新到通信数据库相对应的所述数据表项中;

完成写数据库操作后,必须将所述WriteFlag更新到写空闲,释放写权限至其它所述进程,以使得其它所述进程执行所述写数据库操作。同时通信数据库操作也通过inotify的IN_MODIFY(通信数据库文件被修改)属性,通知了相关监控此通信数据库文件的进程,以便其它进程(譬如SNMPAgent进程,需要及时获取设备配置管理更改信息,通知网管刷新数据)及时得到业务配置管理已经更改,并做出对应的动作。

通信数据读取步骤,在有一个或多个进程(譬如PIDB,PIDC)时,读取所述通信数据库中若干所述数据表项中的数据;由于读操作数据库,不会对数据造成更改,可以几个进程同时读取,不会造成通信数据库的损坏;由于整个设备的软件系统使用同一个数据来源;那么本发明不但提高了数据精准性,也提高了效率。同时通信数据库各个数据表项的相应字段是定义好的,无需进程解析,直接根据业务需要进行处理。

对比现有的进程间通信对复杂大量的业务数据处理,数据发送需要经过封装、发出、接收和解析等步骤,最后才会释放内存,这种方式不断频繁的申请和释放内存,封装和解析数据需要大量的代码进行处理,对比本发明,占用CPU资源多,效率低下。

通信数据保存步骤,在达到预设条件时,将内存中的所述通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。

其中,所述预设条件包括:预设时长和/或通信数据库存在更新。

由于本发明是应用在嵌入式产品中;Flash或其它非易失性的存储器读写操作是有次数限制的,频繁的操作Flash或其它非易失性的存储器,会对Flash或其它非易失性的存储器的寿命造成影响;因此,为了延长Flash或其它非易失性的存储器的寿命,操作以上通信数据库文件读写都是在内存中进行的。本发明会在预设时长(预设时长根据具体产品而定)或通信数据库有重大更新后,譬如新的GPON ONU上线后,将通信数据库的ONU数据表项增加一列,此时会将在内存中的通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。

本发明的通信数据库是整个系统的唯一一份数据文件,做到数据集中管理;同时通信数据库各个数据表项的相应字段是定义好的,无需相应使用数据的进程解析,只需直接根据业务需要进行处理(例如增加、更新、删除和显示等);而且通信数据库可以供多个进程同时进行读数据库操作,提高了效率。譬如命令行进程和HTTPD进程能够同时查找并读取通信数据库中ONU的数据表项中同一个ONU的数据,而不会相互影响。同时应用了inotify机制,当其中一个进程处理了数据,其它进程及线程可以实时得到消息。本发明将嵌入式数据库方法用于进程间通信;将通信数据库和通信数据库文件inotify机制结合,保证了高效可靠的进程间通信;对通信数据库文件能够掉电保护。

下面参考图2详细描述本发明提供的一种嵌入式系统进程间大数据通信的装置的第一实施例。如图2所示,本实施例提供的进程间大数据通信的装置主要包括有:初始化模块、通信数据更新模块、通信数据读取模块和通信数据保存模块。

本发明属于嵌入式领域,主要解决目前进程间通信数据占用CPU及DDR资源多,占用CPU时间长的问题。譬如在GPON OLT(以16口PON口产品为例)产品中,每个PON口能按标准是可以管理128个ONU,16口PON需要管理2048个ONU,每个ONU按ITU G.988的标准配置管理项达到1000项以上,按平均每个配置管理项4个字节,则整个16口GPON OLT光管理ONU数据达到8M左右;对于嵌入式系统而言,这是个庞大的数据,进程间通信数据转移(譬如从PON管理进程到命令行进程),数据打包、数据传送和数据分析等是一个占用资源多、耗时及低效的过程。

初始化模块,用于在嵌入式启动时对通信数据库文件及其相关数据表项进行分析处理;

其中,所述初始化模块包括:初始化数据通信单元、判断读写权限单元、建立读写权限单元、建立业务数据单元、其它需求建立单元和初始化inotify监控单元;

所述初始化模块,用于判断所述通信数据库文件及其相关数据表项是否存在,若存在,则执行所述初始化inotify监控单元,若不存在,则执行所述初始化数据通信单元;

所述初始化数据通信单元,用于在嵌入式系统启动到第一个用户应用进程时,首先判断所述Flash或其它非易失性的存储器中是否存在所述通信数据库文件,若存在,则将所述Flash或其它非易失性的存储器中的所述通信数据库文件存到内存指定的文件路径下,从而在使用int sqlite3_open(const char *filename, sqlite3 **ppDb)判断出所述通信数据库不存在时,建立所述通信数据库,该函数打开一个指向 SQLite 通信数据库文件的连接,返回一个用于通信数据库文件句柄。参数“const char *filename”是通信数据库文件名;通信数据库文件不需要一定存在;若不存在,则通过sqlite自动建立所述通信数据库;参数“sqlite3 **ppDb”为关键数据结构。如果sqlite通信数据库被成功打开(或创建),将会返回成功(0),否则将会返回错误码;同时ppDb参数在通信数据库连接句柄被返回到这个参数,即使发生错误,唯一的一次是如果sqlite不能分配内存来存放sqlite对象,ppDb将会被返回一个NULL值。

如果通信数据库打开(或创建)失败,或者ppDb返回为NULL值,则表示初始化失败,将产生严重告警并停止往下运行程序,等待维护技术人员进行排查故障。

所述判断读写权限单元,用于判断读写权限表是否存在,若否,则执行所述建立读写权限单元;可在通信数据库中,建立一个读写权限表,该读写权限表的表名为ProcCommMuxTable,包含如下字段:

SmuxTableKey,//该读写权限表的“主关键字”,主关键字用于唯一索引读写权限表内的某一条记录,主关键字必须唯一且主关键字的列值不能为空。

WriteMuxFlag, //写权限标识位,0表示写空闲,1表示写占用,本发明中,只能有一个进程在写空闲(0)的时候在置位写占用(1)进行写操作数据库。

WritePIDID,//写操作进程ID,表示本发明使用的设备中软件当前写操作此通信数据库的进程ID。

WritePIDName, //写操作进程名称,表示本发明使用的设备中软件当前写操作此通信数据库的进程名称。

ReadFlag, //读权限标识位,0表示写空闲,1表示写占用,本发明中,多个进程可以同时读操作数据库,即使写操作为1;此为预留为今后所用。

ReadPIDID, //读操作进程ID,表示本发明使用的设备中软件当前读操作此通信数据库的进程ID;此为预留为今后所用。

ReadPIDName //读操作进程名称,表示本发明使用的设备中软件当前读操作此通信数据库的进程名称;此为预留为今后所用。

接上述初始化数据通信单元,首先通过sqlite3_exec(sqlite3 *ppDb, constchar *sql, int (*callback)(void*,int,char**,char**), void *data, char **errmsg) 函数来判断读写权限表是否存在,其中参数sqlite3 *ppDb为上述初始化数据通信单元返回的通信数据库连接句柄,const char *sql表示相应的sql语句,int (*callback)(void*,int,char**,char**)表示sql语句对应的回调函数,void *data表示传递给回调函数的指针参数,char **errmsg表示函数执行错误时返回的错误信息。

其中sql参数为“SELECT * FROM ProcCommMuxTable”,返回成功表示读写权限表存在,返回错误表示读写权限表不存在。

所述建立读写权限单元,用于在所述通信数据库中建立所述读写权限表,以便对所述通信数据库进行互斥机制加以保护,对共享资源进行互斥访问;可通过sqlite3_exec(sqlite3 *ppDb, const char *sql, int (*callback)(void*,int,char**,char**),void *data, char **errmsg) 函数来创建读写权限表,其中sql参数为“CREATE TABLEProcCommMuxTable (" \

"SmuxTableKey INT PRIMARY KEY NOT NULL," \

"WriteFlag INT NOT NULL," \

"WritePIDID INT NOT NULL," \

"WritePIDName CHAR(32)," \

""ReadFlag INT NOT NULL," \

"ReadPIDID INT NOT NULL," \

"ReadPIDName CHAR(32)," );"

返回成功表示读写权限表创建成功,返回错误则产生严重告警并停止往下运行程序,等待维护技术人员进行排查故障。

若读写权限表创建成功,同理使用上面sqlite3_exec函数及sql参数"INSERTINTO ProcCommMuxTable (SmuxTableKey, WriteFlag, WritePIDID, WritePIDName,ReadFlag, ReadPIDID,ReadPIDName) " \

"VALUES (0x5A334F53, 0, 0, ‘’, 0, 0, ‘’); ",将读写权限表数据进行初始化。

所述建立业务数据单元,用于在业务数据表不存在时,创建所述业务数据表;

其中,所述业务数据表包括:ONU配置管理表、接口配置管理表、VLAN配置管理表、路由配置管理表和ACL配置管理表。例如用在GPON OLT的ONU的业务数据表的字段包含几十项,所述业务数据表的GPON_ONU_Table至少包含如下字段:

("\

"ONUIndexKey INT PRIMARY KEY NOT NULL," \ //主键,主键不能够重复, 一般把主键名设为"id", 不需要赋值, 会自增。

"ONU_ID INT NOT NULL," \ //表示ONU的ID。

"SN CHAR(12) NOT NULL," \ //表示GPON ONU的Searial Number,识别ONU。

"MACAddr CHAR(6) NOT NULL," \ //ONU MAC地址。

"LOID CHAR(32)," \ //ONU的逻辑ID。

"PASS CHAR(32)," \ //ONU的逻辑密码。

"Status INT," \ //ONU状态(O1~O7),对应GPON标准的7个状态。

"VendorID CHAR(32)," \ //ONU的设备提供商ID。

"HWVersion CHAR(32)," \ //ONU的硬件版本。

"SWVersion CHAR(32)," \ //ONU的软件版本。

"EquipID CHAR(32)," \ //ONU的设备ID。

"OnlineTime CHAR(32)," \ //ONU的上线时间。

"OfflineTime CHAR(32)," \ //ONU的下线时间。

"RxPower INT," \ //ONU的PON口光接收功率。

"TxPower INT);" //ONU的PON口光发送功率。

所述其它需求建立单元,用于分析所述业务数据表的其它需求(所述其它需求即为其它实际产品的需求),并建立其它需求表,譬如GPON OLT中对Vlan的配置管理表,对端口的配置管理表等,都可建立相应的数据表项。

所述初始化inotify监控单元,用于将所述通信数据库的所述文件路径以及所述通信数据库文件加入到inotify进行监测。在本模块中,可执行初始化inotify监控文件动作:通过inotify_init()创建一个inotify实例,此函数返回文件操作句柄,供后面函数使用。通过inotify_add_watch(int fd, const char *pathname, uint32_t mask) 将通信数据库的文件路径及通信数据库文件加入到inotify进行监测(使用const char *pathname参数),参数uint32_t mask即为监控的动作有IN_ACCESS(通信数据库文件被访问),IN_ATTRIB(通信数据库文件属性发生变化),IN_CLOSE_WRITE(以write方式打开通信数据库文件并关闭),IN_CLOSE_NOWRITE(以非write方式打开通信数据库文件并关闭),IN_CREATE(通信数据库文件或目录被创建),IN_DELETE(通信数据库文件或目录被删除),IN_DELETE_SELF (被监测的通信数据库文件或目录被删除),IN_MODIFY(通信数据库文件被修改),IN_MOVE_SELF(被监测的通信数据库文件或目录移动),IN_MOVED_FROM(通信数据库文件移出被监测的目录),IN_MOVED_TO(通信数据库文件移入被监测的目录),IN_OPEN (通信数据库文件被打开)。

inotify是一个内核用于通知用户空间程序文件系统变化的机制,监控通信数据库文件原理为:inotify机制借用了内核里面的notify通知链技术,针对文件系统里面的使用,主要是在inode结构体里面加入了相关的字段;每新建一个inotify实例,内核都会分配一个fsnotify_group;当有事件被监控到了以后的执行流程将把事件挂入到组中的notification队列中,唤醒等待队列,并根据inotify_add_watch函数mask传入的产生发送信号通知应用层。

其中,所述通信数据更新模块,用于在通信数据库及通信数据库文件inotify初始化成功后,即可被各个进程进行调用使用,当某个进程(譬如PIDA)需要更新通信数据库,首先判断所述通信数据库的表项SmuxTableKey中WriteFlag是否为能合法写(0),若是,则更新所述WriteFlag为写占用(1);

此时将待更新(包括加、改、删操作)的所述数据表项更新到通信数据库相对应的所述数据表项中;

完成写数据库操作后,必须将所述WriteFlag更新到写空闲,释放写权限至其它所述进程,以使得其它所述进程执行所述写数据库操作。同时通信数据库操作也通过inotify的IN_MODIFY(通信数据库文件被修改)属性,通知了相关监控此通信数据库文件的进程,以便其它进程(譬如SNMPAgent进程,需要及时获取设备配置管理更改信息,通知网管刷新数据)及时得到业务配置管理已经更改,并做出对应的动作。

通信数据读取模块,用于在有一个或多个进程(譬如PIDB,PIDC)时,读取所述通信数据库中若干所述数据表项中的数据;由于读操作数据库,不会对数据造成更改,可以几个进程同时读取,不会造成通信数据库的损坏;由于整个设备的软件系统使用同一个数据来源;那么本发明不但提高了数据精准性,也提高了效率。同时通信数据库各个数据表项的相应字段是定义好的,无需进程解析,直接根据业务需要进行处理。

对比现有的进程间通信对复杂大量的业务数据处理,数据发送需要经过封装、发出、接收和解析等过程,最后才会释放内存,这种方式不断频繁的申请和释放内存,封装和解析数据需要大量的代码进行处理,对比本发明,占用CPU资源多,效率低下。

通信数据保存模块,用于在达到预设条件时,将内存中的所述通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。其中,所述预设条件包括:预设时长和/或通信数据库存在更新。

由于本发明是应用在嵌入式产品中;Flash或其它非易失性的存储器读写操作是有次数限制的,频繁的操作Flash或其它非易失性的存储器,会对Flash或其它非易失性的存储器的寿命造成影响;因此,为了延长Flash或其它非易失性的存储器的寿命,操作以上通信数据库文件读写都是在内存中进行的。本发明会在预设时长(预设时长根据具体产品而定)或通信数据库有重大更新后,譬如新的GPON ONU上线后,将通信数据库的ONU数据表项增加一列,此时会将在内存中的通信数据库文件拷贝到Flash或其它非易失性的存储器中,从而实现掉电保存。

本发明的通信数据库是整个系统的唯一一份数据文件,做到数据集中管理;同时通信数据库各个数据表项的相应字段是定义好的,无需相应使用数据的进程解析,只需直接根据业务需要进行处理(例如增加、更新、删除和显示等);而且通信数据库可以供多个进程同时进行读数据库操作,提高了效率。譬如命令行进程和HTTPD进程能够同时查找并读取通信数据库中ONU的数据表项中同一个ONU的数据,而不会相互影响。同时应用了inotify机制,当其中一个进程处理了数据,其它进程及线程可以实时得到消息。本发明将嵌入式数据库方法用于进程间通信;将通信数据库和通信数据库文件inotify机制结合,保证了高效可靠的进程间通信;对通信数据库文件能够掉电保护。

以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应以所述权利要求的保护范围为准。

相关技术
  • 一种嵌入式系统进程间大数据通信的方法及装置
  • 一种用于嵌入式操作系统进程间通讯优化的处理方法
技术分类

06120112410113