基于ARM 的火灾信息传输网关设计
( 4) 系统维护模块
主要负责确保系统各个模块的正常运行,同时记录及上传工作日志,供系统维护人员参考,同时收集上来的数据经过分析和挖掘,可以作为产品性能指标制定的依据。各模块在建立之初将会在数据区注册,维护模块通过这个注册信息实现心跳应答机制来判断各个模块的工作状态。同时,还将数据区中的日志信息提取出来写入日志文件,并提出发送日志文件请求给网络通信模块。
每个模块依照分工完成职能之内的工作,不属于职能内的工作通过写入数据区交由职能模块去完成。数据区是各个模块传递信息的媒介,通过格式化的数据写入和读取,实现模块间的信息共享和职能分工。
3. 3 各模块详细设计
3. 3. 1 流程分析
核心管理模块是嵌入式网关入口,当嵌入式网关加电启动,嵌入式网关的操作系统负责启动核心管理模块。此时,其他模块还未启动。核心模块首先为其他模块启动初始化系统环境,如创建管道,共享内存等。接着,核心模块启动其他模块。这时,系统将启动完成。
接着,核心模块建立定时器,创建定时器是为了定时地检测其他模块,以判断其他模块的状态,称这个过程为“心跳”。
当以上过程完成后,核心管理模块开始监视所有管道,当管道有数据时,他读取定长的数据并分析,找出源地址、目的地址及命令字。根据命令字类型的不同做不同的处理。程序流程图如图4 所示。
图4 程序启动过程
( 1) 初始化。初始化的主要工作是为模块间的通信建立有名管道,每个与核心模块通信的进程有一个管道。当前系统需要创建四个管道。其他模块如果想要使用管道,必须首先打开管道。所有与管道的通信都有API 供其他用户使用。
( 2) 启动其他模块。核心模块通过子进程调用execl( ) 来启动其他模块。每个其他模块都是一个可执行程序,通常位于一个固定的路径及固定的文件名。每个模块在启动之后需要向核心模块发送注册信息,这些信息包括模块标识、进程ID、进程状态等。登记信息由核心模块保留,供以后使用。
( 3) 创建定时器。核心模块需要定时地检测其他模块的生存状况,通过注册一个定时器,可以定时地触发检测功能。
( 4) 开始*。当所有初始化工作完成以后,核心模块开始进入工作状态。它的主要工作就是负责处理管道信息。通过使用select ( ) 函数可以实现同时*多个管道。当某个管道有数据,核心模块读取数据包( 格式详见后文) ,并解析出包头,得到包的源地址,目的地址,及控制字并加以分析,选择处理流程。处理流程包括: 数据中转,巡检,系统维护等。当该数据包处理完成以后,核心模块返回继续等待下一个数据包。
( 5) 处理数据中转。其他模块间无法直接通信,都必须通过核心模块进行中转。数据包中指明了包的源地址,目的地址及控制字。这里的控制字说明数据需要中转,核心模块解析到数据包需要中转,就将包写入到给定目的地址的模块管道。
( 6) 处理巡检。服务器需要定时地检测前置机各个模块的状态,于是发送巡检请求给网络模块,网络模块解析后组包发送给核心模块,核心模块在分析包发现该包是巡检请求,于是通过kil l( ) 函数及注册记录信息,判断各个模块的状态,并组包发送给服务器。
( 7) 处理系统维护。系统维护的主要任务是为了保证系统所有模块的正常运行。前面初始化了一个定时器,通过定时器,可定时地查询其他模块的状态。当发现某个模块异常,核心模块将重启该模块。
3. 3. 2 关键数据结构
( 1) 包格式
( 2) 模块ID 定义
如表1 所示:
表1 模块ID 定义
# defineID_CORE0x0001
# defineID_NET WORK0x0002
# define ID_COM0x0004
# defineID_CT L0x0008
# define ID_LOG0x0010
( 3) 控制字定义
如表2 所示:
表2 控制字定义
( 4) 管道初始化
首先,用户必须选择正确地管道初始化函数,通过初始化函数,用户正确的建立与管道的连接。初始化函数如表3 所示。
表3 初始化函数
评论