记录最近的针对网关报文的Excel处理工具设计路线。

##记录最近的针对网关报文的Excel处理工具设计路线。

需求:

首先说下开发的需求:最近有个产品是汽车网关。汽车网关主要功能和路由器差不多,也就是查询某条报文是否需要被转发。虽然没有家用路由器那么多的协议和额外功能,但报文比较多,一般汽车上也会有400-600条不同的报文。有些报文需要以高频的速度转发到不同的车身节点上。也就是说网关需要了解这几百条报文从哪来,到哪去。网关要快速响应并转发。

这几百条报文在代码中实现不算复杂,即使只用Switch和if语句也可以实现。但考虑到后续的维护,这些判断语句一定会给我们照成网关查询响应速度慢和报文变更麻烦等一系列问题。因此我希望可以将设计和维护聚焦在报文和后续变更上。而不需要考虑报文转发的代码逻辑。

假设我们有10条新增的报文需要被转发,那我们只需要在数据结构(或数据库)中添加这10条报文,而不需要修改网关的底层转发代码。如果我们使用Switch和if语句,我们不需要数据结构(或数据库),但得不断的往转发代码中添加条件,这会导致代码臃肿,可读性也会直线下降。

所以我需要设计一个简单的工具,来统一管理报文表和转发代码的关系。这个工具可以让我导入路由表后生成一份报文转发代码。这份代码我可以直接合成进我的网关工程中。网关每次收到报文后都会执行这份代码,看是否需要被转发之后进行后续的动作。

这样一来对变更的管理就从对代码管理变成了对表格的管理。如果有报文变更,我只需要维护报文表就行了。

目标:

假设需求上有600条不同的报文,如果使用巨大的switch和if语句是不合理也的。因为网关作快速响应的硬件,如果查询时间太长是会影响性能的。而且网关路由的变更是非常频繁的,经常需要添加、删除或对转发条件做出修改。

我有几个设计的目标和对应的方法:

  • 网关的查询快捷——需要使用二分查询算法来查询报文。
  • 报文变更方便——将客户需求整理成Excel。维护Excel就相当于维护程序。
  • 报文变更不影响网关程序结构——使用DAO方式生成C文件。将C文件合成进网关工程。实现模块化。

设计:

报文有几个主要属性,分别是:源地址、报文ID、报文长度、目的地址、周期。

还有有些次要属性,属于标定项,意思是当达成特定条件时特定的报文才需要被转发(或者说不应该被转发)。

我选择用Python来写。主要有几个原因:

  • 比起其他语言我Python会的多点。
  • Python有一些现成的Excel处理库,可以很方便的使用。
  • 我对界面的设计要求不高,即使后续添加新的功能也可以使用简单的界面添加。

下面是整个设计思路:

根据客户提供的需求把600条报文整理后放进Excel中,软件从Excel文件中提取数据,做出排序去重和判断后生成一份我们需要的C语言文件。

  • 我需要软件在Windows7上运行。所以选用3.8版本的Python。
  • 界面使用Python原生的tkinter库。配合外部的TKinterDesigner做界面设计。
  • Excel文件的数据提取使用第三方的xlwings库。
  • 数据提取后使进行数据验证,排序和去重。这部分使用一些算法就可以实现。
  • DAO功能使用Python中string库的Template模板替换。
  • 软件的打包可以使用Python原生的PyInstaller库,也可以使用TKinterDesigner直接发布。

其中还需要用到一些小东西。

  • tkinter是单线程界面,配合外部Excel提取需要使用多线程。
  • tkinter可以添加进度条让用的人看起来舒服一些。
  • 界面提醒可以使用日志打印也可以使用输出重定向,把程序运行情况打印到界面上或写入日志文件。
  • DAO的实现可以配合Json的解析。让模板替换的自定义程度更高一些。