本文来自 csdn ucser, http://blog.csdn.net/perfectpdl 转载注明出处,谢谢.
接
sip/ims 视频客户端开发,支持接入sip软交换,ims核心网,支持 语音,视频,即时通信功能,视频格式支持 h263,h264,mpeg4 软编软解,提供硬件编解码接口对接,支持 DBA动态码率调整,NACK, PLI,FIR等视频丢包处理能力,提供SIP服务器,有兴趣请联系我。
WebRTC软件架构由两套应用程序调用接口组成:Web API与Native API;Web API是WebRTC项目提供给Web开发者的一套JavaScript实现的API。为了令WebRTC应用能够“一次开发,随处运行”, W3c已经定制了 WebRTC 1.0 草案,草案定义了重要的API接口如Network Stream API与getUserMedia API,
Native
API是一组根据Web API定义的底层C++接口,二次开发者可以利用JavaScript对其进行封装供给浏览器调用,或者直接用其开发本地程序。因为Native API需要直接与底层的硬件及操作系统进行交互,所以在不同的系统环境,如Windows、Linux、Android中不尽相同。不同浏览器会有不同的实现方式;WebRTC最核心的地方在于其向浏览器引擎加入了视频引擎、音频引擎、网络传输及会话控制等新功能模块。其中,音视频引擎模块提供了从音视频采集设备,如麦克风、摄像头,到网络侧音视频处理链的总体框架。为了避免专利纠纷,音视频编码都采用了开源的编码格式,如iLBC、iSAC、VP8等,同时提供相应的抖动缓冲及音视频增强等功能。在网络传输方面,WebRTC使用RTP/SPRT进行媒体流传输,使用ICE(Interactive
Connectivity Establishment)技术进行媒体流的私网穿透。WebRTC客户端使用JSEP(Javascript Session Establishment Protocol)协议草案规范WebRTC通信双方应如何交换SDP信息,并进行媒体流协商和控制。JSEP的设计思路将媒体层的控制交由浏览器,而将信令层的控制交由Web应用开发者,从而使得信令状态机可与浏览器彻底分离,保持了协议的灵活性。
在写这篇文章之前,首先非常感谢吴剑洪(南京同新软件)创始人的大力支持。本软件同时也参考了北京三维力控的一部分设计思想。
本软件主要分为基础数据配置(设备配置、变量配置),数据采集和监控,前台页面部分。
下面对以上三个部分进行功能的分解。
基础信息部分:
这部分的功能主要是设备通信协议,设备类型,变量类型的添加,删除,修改,同时对实例设备,变量的添加,修改,删除操作,同时包括设备和变量的连接,即每个设备中包括那些变量。
所使用的技术包括:各种通信设备接口协议,多线程。
数据采集和监控部分:
这部分的功能主要是根据基础信息的配置信息来采集设备数据和设备变量。同时对设备进行报警和报警后的处理。数据的保存。
所用的技术包括:多线程,内存数据库,共享内存,IOCP等
前台页面部分:
这部分的功能主要是用户界面部分。包括基础数据的配置和设备的监控。用户管理等。
所用技术:severlet ,java,jsp 等、
本文中也有很多错误之处,请大家指教。
如有需要联系本人:QQ:81704297 手机:15895987857
当一个Bean需要访问另一个Bean时,可以显示指定引用装配它。但是,如果你的容器能够自动装配Bean,就可以免去手工配置装配的麻烦。
Spring IoC容器能够帮助你自动装配Bean。只要在<bean>的autowire属性中指定自动装配模式就可以了。以下是Spring 3.X支持的自动装配模式。
no:不执行自动装配。必须显示装配依赖
byName:对于每个Bean属性,装配一个同名的Bean。
byType:对于每个Bean属性,装配类型与之兼容的一个Bean。如果找到超过一个Bean,将抛出UnsatisfiedDependencyException异常
constructor:对于每个构造函数参数,首先寻找与参数兼容的Bean。然后选择具有最多匹配参数的构造函数。对于存在歧义的情况,将抛出UnsatisfiedDependencyException异常。
默认模式是no,但可以设置<beans>根元素的default-autowire属性修改。这个默认模式将被Bean自己指定的模式覆盖。
注:Spring 3.X不支持autodetect自动装配模式,使用@Autowired注解代替。
尽管自动装配功能非常强大,但代价是降低了Bean配置的可读性。因为自动装配由Spring在运行时执行,你无法从Bean配置文件中得到Bean装配的方式。建议仅将自动装配应用到组件依赖不复杂的应用程序中。
(1)按照类型自动装配
可以将sequenceGenerator这个Bean的autowire属性设置为byType并且不设置prefixGenerator属性。然后Spring将试图装配类型与PrefixGenerator兼容的Bean。在这个例子中,将自动装配datePrefixGenerator。
<bean id="sequenceGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.SequenceGenerator" autowire="byType"> <property name="initial" value="100000" /> <property name="suffix" value="A" /> </bean> <bean id="datePrefixGenerator" class="com.jackie.codeproject.springrecipesnote.springioc.DatePrefixGenerator"> <property name="pattern" value="yyyyMMdd" /> </bean>
按照类型装配的主要问题是有时候在IoC容器中有超过一个与目标类型兼容的Bean。在这种情况下,Spring将无法确定哪个Bean最适合于该属性,因此会抛出异常.
<bean id="sequenceGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.SequenceGenerator" autowire="byType"> <property name="initial" value="100000" /> <property name="suffix" value="A" /> </bean> <bean id="datePrefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.DatePrefixGenerator"> <property name="pattern" value="yyyyMMdd" /> </bean> <bean id="yearPrefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.YearPrefixGenerator"> <property name="pattern" value="yyyy" /> </bean>运行程序,抛出UnsatisfiedDependencyException异常:
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'sequenceGenerator' defined in class path resource [applicationContext.xml]: Unsatisfied dependency expressed through bean property 'prefixGenerator': : No qualifying bean of type [com.codeproject.jackie.springrecipesnote.springioc.PrefixGenerator] is defined: expected single matching bean but found 2: datePrefixGenerator,yearPrefixGenerator; nested exception is org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type [com.codeproject.jackie.springrecipesnote.springioc.PrefixGenerator] is defined: expected single matching bean but found 2: datePrefixGenerator,yearPrefixGenerator(2)按照名称自动装配
byName是另一种自动装配模式。Spring将试图装配一个与属性名相同的Bean,而不是兼容的类型,这样能解决按照类型的自动装配的问题。
<bean id="sequenceGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.SequenceGenerator" autowire="byName"> <property name="initial" value="100000" /> <property name="suffix" value="A" /> </bean> <bean id="prefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.DatePrefixGenerator"> <property name="pattern" value="yyyyMMdd" /> </bean>按照名称的自动装配并不能工作于任何情况。有时候不可能使目标Bean的名称与属性相同。在实践中,往往需要在保持其他依赖自动装配的同时明确指定歧义的依赖。这意味着混合了显示装配和自动装配。
(3)按照构造程序自动装配
constructor自动装配模式相对byType模式更复杂一些。对于具有单个构造程序的Bean,Spring将试图为每个构造程序参数装配一个类型兼容的Bean。但对于具有多个构造函数的Bean,Spring首先试图为每个构造函数的每个参数找到一个类型兼容的Bean,然后将选择具有最多匹配参数的构造函数。
假定SequenceGenerator有一个默认的构造函数和一个具有PrefixGenerator参数的构造函数
public SequenceGenerator() { } public SequenceGenerator(PrefixGenerator prefixGenerator) { this.prefixGenerator = prefixGenerator; }在这种情况下,第二个构造函数匹配并被选中,因为Spring可以找到一个类型与PrefixGenerator兼容的Bean。
<bean id="sequenceGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.SequenceGenerator" autowire="constructor"> <property name="initial" value="100000" /> <property name="suffix" value="A" /> </bean> <bean id="datePrefixGenerator" class="com.codeproject.jackie.springrecipesnote.springioc.DatePrefixGenerator"> <property name="pattern" value="yyyyMMdd" /> </bean>如果使用这种装配模式,需要避免构造函数歧义。