一、源码路径
https://github.com/weiganyi/jphone
二、界面截图
由于应用程序框架本身没有界面,所以这里显示一下基于应用程序框架开发的两个应用程序的界面。
软电话界面:
日志服务器界面:
三、背景
最开始做这个项目的时候,是由于发现了一个叫PjSIP的开源SIP协议栈,实现上要比OSIP成熟许多,用它来开发SIP应用也更简单方便,我就考虑基于PjSIP来做一个SIP软电话原型。
我选择用C++语言来实现,原因是我想要在这个项目中实现一些通用机制,C++语言比那些解释语言更适于底层开发,同时C++的语言特性也要比C语言丰富许多。
软件界面这块我用VC来做,但是我之前只用过VC6,新的VC版本没有用过,考虑到这只是一个原型产品,界面难看点关系不大,本着界面能用就行的原则,还是使用VC6来做界面。
对于软件配置的存储,采用本地文件和MySQL数据库并行的方式,主要考虑还是想提供多样化的选择。
项目分了两个阶段,第一阶段我把这个SIP软电话原型实现了,也实现了一些基本的通用机制。后来随着自己对软件系统架构理解的积累,我考虑着要把那些通用机制增强成一些通用组件框架,并且能够基于这个组件方便的开发其它的应用程序,这就对组件的通用性提出了更高的要求。第二阶段我进行了代码重构和增强,实现了一个通用的应用程序组件框架。为了验证组件框架的通用性,除了原来基于它实现的SIP软电话原型(单线程模式)外,我还实现了一个日志服务器原型(多线程模式)。
对于操作系统接口的使用,目前直接使用的Windows的接口,后续如果要做多操作系统兼容,可以再对操作系统接口进行封装,这是个工作量问题。
四、功能实现
项目的功能实现分以下三部分:
1、实现通用的应用程序组件框架,封装操作系统的基本接口,不依赖第三方库实现开发其它应用程序所需的各类组件模块,提供方便的使用接口。
2、实现SIP软电话原型,能够通过软件界面操作完成基本通话,支持基本的配置参数,发起呼叫可以通过号码按键或点击最近通话号码的方式进行。
3、实现日志服务器原型,支持最多10个日志客户端的同时连接,并能显示选中连接上接收的日志,支持基本的配置参数。
五、总体设计思路
1、组件框架包含了几十个类,所以设计了一个类的继承体系树,从最基本JObject根类派生出其他各式各样的类。把同一类功能的类封装在一个模块里,对于每个模块,如果有多种类型的类就要定义一个抽象基类来定义它们的接口。
2、通过一系列通用模块来构成应用程序组件框架,如:模块、异常、智能指针、锁、单件、字符串、日志、内存管理、定时器、通信、消息路由、事件、链表、队列、持久化、后台任务、线程管理等。
3、基于应用程序组件框架,通过增加上层的SipUa模块和代理模块就能实现出SIP软电话,通过增加上层的日志服务器模块和代理模块就能实现出日志服务器。
4、为了避免名字污染,对于应用程序组件框架的各个模块,都包含在JFrameWork的名字空间里。在SIP软电话和日志服务器里,要把这个名字空间引用进来。
5、应用程序的配置存储支持Ini文件、Xml文件、MySQL三种方式,根据JDaemon后台任务的配置文件jdaemon_cfg.