关于通信协议信令解析软件的设计

zheng518 2013-02-13 10:08:42
因为我是搞通信系统开发,系统中有很多的协议需要手工解析比较麻烦。因此我想设计这样一个软件,能达到如下效果:
1.把协议栈上所有涉及到的协议和信元等进行管理,将其封装一个DLL,供应用程序使用;
2.某一个协议对应的原始数据,十六进制的。自动将其翻译成该信令对应的每个字段值以及含义;

为达到上述效果,其中第一点很关键,因为我将协议相关的基本信息封装成DLL,一旦信令基本信息有变化,直接修改DLL即可,应用软件可以调用DLL实现第二点。
但是第一点怎么实现?有很多方法,不过我还不确定哪种比较有效,因此想在论坛和各位探讨。先举例说明如下
第一种:用关系型数据库或者内存数据库,如sqllite;
第二种:将信令所有涉及的基本信息全部写到代码中;
第三种:将信令所有涉及的基本信息全部写入二进制文件中。

什么样的方式能实现这个DLL,请各位指点一二。谢谢!
...全文
327 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
玲cc 2013-02-19
  • 打赏
  • 举报
回复
引用 9 楼 zheng518 的回复:
引用 8 楼 scliu1987 的回复:还是用第一种吧。后面两种的可视化程度比较差,到时候你想修改协议栈的映射会很麻烦的。 我目前就是按照第二种方式实现的,而且仅仅拿十几个常用的信令作为测试使用,使用后我发现,这些信令一旦要修改,如修改名称、说明等信息,我就得改源代码。所以我在思索用其他办法。 第一种,也是我目前比较倾向的方法,但是容易让其他人看到信令的结构或者……
武功再高,也怕内奸啊。所以安全问题最重要还是从管理上去约束。就算你把信令结构写死在代码里,想要破解的人只要反编译一下dll,基本上还是暴露无余。
zheng518 2013-02-17
  • 打赏
  • 举报
回复
引用 6 楼 vpjian 的回复:
这要的是这种效果吧。 这个简单,08年已经在用了,没什么难,基本原理是将协议拆分成最小能自解释的单元,然后在一个地方重新组织。 对象抽像成三个层次(协议,数据包,数据项) 协议:单实例,负责在数据中查找出正确的包和生成这个协议相关的对像(如已命名的包和数据项)。 数据包:解释和生成二进制数据,说白了就是数据项的集合,只是加了简单的逻辑来处理这个集合。当然遇到比较极品的格式它要完……
和你所说的效果很像,我也是这么做的。但是我在代码中写死有个问题,我们这些信令都不断的在更新和增加,甚至有公共部分经常更新。维护起来非常麻烦。
zheng518 2013-02-17
  • 打赏
  • 举报
回复
引用 4 楼 sp1234 的回复:
你能举出5个测试用例来约束“什么样的方式能实现这个DLL”这个问题吗?如果能举出来,那么这个问题也许有个答案。 否则如果你根本举不出需求标准,这就是无厘头的问题。
需求我当然很明确,我也看过其他行业的信令解析软件。比如说公网上的一个呼叫建立信令。但是解码前你并不知道是什么信令。你的输入只是一个原始的数据流,解码后你知道这是一个呼叫建立信令,而且知道主叫号码、被叫号码、号码所属地区等等
zheng518 2013-02-17
  • 打赏
  • 举报
回复
引用 8 楼 scliu1987 的回复:
还是用第一种吧。后面两种的可视化程度比较差,到时候你想修改协议栈的映射会很麻烦的。
我目前就是按照第二种方式实现的,而且仅仅拿十几个常用的信令作为测试使用,使用后我发现,这些信令一旦要修改,如修改名称、说明等信息,我就得改源代码。所以我在思索用其他办法。 第一种,也是我目前比较倾向的方法,但是容易让其他人看到信令的结构或者修改结构,这个比较“危险”
vpjian 2013-02-16
  • 打赏
  • 举报
回复
这要的是这种效果吧。


这个简单,08年已经在用了,没什么难,基本原理是将协议拆分成最小能自解释的单元,然后在一个地方重新组织。

对象抽像成三个层次(协议,数据包,数据项)
协议:单实例,负责在数据中查找出正确的包和生成这个协议相关的对像(如已命名的包和数据项)。
数据包:解释和生成二进制数据,说白了就是数据项的集合,只是加了简单的逻辑来处理这个集合。当然遇到比较极品的格式它要完全负责处理。
数据项:解释和生成二进制数据的最小的已命名的单位。

至于保存在那里是没什么关系的。只要方便就可以了,因为没有做更新服务器,我是直接在代码写死的,要更新DLL。
玲cc 2013-02-16
  • 打赏
  • 举报
回复
还是用第一种吧。后面两种的可视化程度比较差,到时候你想修改协议栈的映射会很麻烦的。
showjim 2013-02-16
  • 打赏
  • 举报
回复
如果协议是可控的,那么比较简单,序列化+反序列化就可以了。 否则一个一个的封装是不可避免的。
  • 打赏
  • 举报
回复
你能举出5个测试用例来约束“什么样的方式能实现这个DLL”这个问题吗?如果能举出来,那么这个问题也许有个答案。 否则如果你根本举不出需求标准,这就是无厘头的问题。
  • 打赏
  • 举报
回复
引用 楼主 zheng518 的回复:
但是第一点怎么实现?有很多方法,不过我还不确定哪种比较有效,因此想在论坛和各位探讨。先举例说明如下 第一种:用关系型数据库或者内存数据库,如sqllite; 第二种:将信令所有涉及的基本信息全部写到代码中; 第三种:将信令所有涉及的基本信息全部写入二进制文件中。 什么样的方式能实现这个DLL,请各位指点一二。谢谢!
几乎对所有人来说,其实选择哪一种都可以。编程的目的是为了通过测试,不是为了别的。但是如果你没有自我开发测试系统、进行重构、架构上随时改变自我的准备,过分纠结于“什么理论方法最完美”,那就是上学把脑袋学傻了,虽然学了一些知识点,但是没有学到技术的本质。
  • 打赏
  • 举报
回复
引用 楼主 zheng518 的回复:
因为我是搞通信系统开发,系统中有很多的协议需要手工解析比较麻烦。因此我想设计这样一个软件,能达到如下效果: 1.把协议栈上所有涉及到的协议和信元等进行管理,将其封装一个DLL,供应用程序使用;
不要空洞地说什么“所有”! 搞技术的人不是搞行政的,真正高级技术的人只承认“存在”而不是会胡乱使用“所有、全部、必须”等等词儿。 你罗列出最近1个月或者3个月内需要实现的协议,然后有针对性的开始设计。不用夸大。 真正好的、通用的设计,是通过现在小范围上成功,然后重构几十次,才修改出来的。不是那种没有基础就夸口说“我要囊括所有”设计出来的。当你夸大时,我们反而不知道你要做什么、有没有能力和时间做,也就没有技术型的建议了!
wanghui0380 2013-02-14
  • 打赏
  • 举报
回复
其实我挺郁闷这个问题的,lz都在考虑些什么啊 第一种:用关系型数据库或者内存数据库,如sqllite; 你协议解析和数据库有啥关系?word文档本质上也可以说就是一个协议,难道你打算使用sqllite把word文档实现一遍。 第二种:将信令所有涉及的基本信息全部写到代码中; 第三种:将信令所有涉及的基本信息全部写入二进制文件中。 额,代码?二进制??他们有啥子区别啊,难道说你实际想说的是解释性语言和编译性语言的区别。 元数据描述本质上语言木啥关系,而根据元数据描述去生成代码也不是太大问题。比如你给我个xml定义我用T4生成一个stuct或者class并生成相应的序列化/反序列化代码,问题并不大。 其实你参考一个工具Apache Thrift,大概就明白俺们的意思了。
devmiao 2013-02-13
  • 打赏
  • 举报
回复
不考虑极高的性能和原代码安全,仅仅方便灵活的话,可以使用脚本语言实现变动的部分。主程序Host一个脚本引擎。

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧