OSGi环境下Java和C的通信机制的实现方法

文档序号:7778747阅读:261来源:国知局
OSGi环境下Java和C的通信机制的实现方法
【专利摘要】本发明提供一种OSGi环境下Java和C的通信机制的实现方法,Java程序运行在OSGi框架下,C程序运行于linux系统上,所述实现方法至少包括:在OSGi环境下注册中转消息Bundle,使Java程序能够使用消息服务,同时能响应C程序发送过来的消息;C程序与中转消息Bundle建立通讯socket,或者Java程序通过向中转消息Bundle发起通讯请求,由中转消息Bundle建立与C程序的socket;C程序通过中转消息Bundle收发socket消息来与Java程序通讯;Java程序通过中转消息Bundle的消息服务与C程序通讯。本发明的OSGi环境下Java和C的通信机制的实现方法兼有通信的高效率和安全性;省去了开发JNI的大量时间,同时又为JAVA与C通信提供了可靠的库支持,为C与Java通信环境搭建了很好的桥梁。
【专利说明】OSGi环境下Java和C的通信机制的实现方法
【技术领域】
[0001]本发明涉及计算机通信的【技术领域】,特别是涉及一种OSGi环境下Java和C的通信机制的实现方法。
【背景技术】
[0002]Java语言的功能很强大,但不是万能的。在Java语言中,丢弃了指针这个功能强大且与底层交互密切的语言工具。单从效率层面上来讲,Java与C相比较,Java的执行效率远远低于C。对于一些算法要求比较高的,Java便不是最好的选择。Java是一种面向对象的语言,在各种纷繁复杂的APP应用中,Java备享赞誉,美名远播。这样就带来了 Java与C共存协同合作的问题。Java的创造者们在开发之初就已经考虑到了这一点,在Java中提供了与 C/C++的编程接口,这就是 Java 本机接口(Java Native Interface, JNI)。
[0003]Unix D omain Socket即Uinx域套接字,用于同一台机上运行的进程之间的通信。Unix域套接字的执行效率比因特网域的套接字更高,它是实现Java与C通信的桥梁。
[0004]Open Service Gateway Initiative,即 OSGi (JSR291)亦称做 Java 语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。简单的说,通过OSGi可以在后台对设备组件进行安装、升级或卸载而无需打断该设备的正常运行。OSGi作为Java模块化的载体,运行在Java虚拟机(Java Virtual Machine, JVM)之上。
[0005]现有技术中,解决Java程序和C程序之间的通信问题,通常采用的方式有如下几种:
[0006](I) Socket 通信方式
[0007]Socket是建立在传输协议(主要是TCP和UDP)上的一种套接字规范。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了 TCP协议软件和实现了要节制规范的计算机之间的通信成为可能。利用标准的Socket通信的方法,可以实现任何平台任何进程之间的Socket通信,从而实现信息的传递。然而,这种实现方案只能运行在任何两台安装了 TCP协议的机器之间,利用网络套接字通信,而在其他环境下则无法运行及通?目。
[0008](2)文件共享方式
[0009]通信双方将需要传递的参数等信息,通过文件进行传递。然而,这种方法需要注意线程同步和安全等问题,而且其效率也相对比较低下。同时,由于该方式虽然较为简单易用,但是对文件的操作的安全性则成了通信的最大障碍。因此,在对效率要求比较高且对数据安全要求比较高的场合,这种方式便不可取了。
[0010](3)通过JNI方式
[0011 ] JNI是编写Java本机方法和把JVM嵌入到本机应用程序中的标准接口。通过JNI编写程序,可以很方便的做到跨平台移植。采用JNI是目前为止较为流行的Java通信方式。单独使用JNI给JAVA与C之间的通信带来较大的灵活性。但是JNI本身只是一系列通用接口,其实现依赖于设计者本身的技术解决方案,因此带来不确定性。[0012]综上所述,现有的方案的运行环境各异且各有优缺点,有的运行于不同主机,有的运行于JVM。OSGi是近年来新提出的标准,Java模块化是目前比较热门的发展趋势,因此在嵌入式平台下,OSGi环境中,提出一套Java与C的通信解决方案,同时能够解决通信安全、通信效率等问题则显得非常有必要。

【发明内容】

[0013]鉴于以上所述现有技术的缺点,本发明的目的在于提供一种OSGi环境下Java和C的通信机制的实现方法,使得JAVA环境下的任务和C环境的任务能够互相通信。
[0014]为实现上述目的及其他相关目的,本发明提供一种OSGi环境下Java和C的通信机制的实现方法,其中Java程序运行在OSGi框架下,C程序运行于Iinux系统上,所述实现方法至少包括:在OSGi环境下注册中转消息Bundle,使Java程序能够使用消息服务,同时能响应C程序发送过来的消息;C程序与中转消息Bundle建立通讯socket,或者Java程序通过向中转消息Bundle发起通讯请求,由中转消息Bundle建立与C程序的socket ;C程序通过中转消息Bundle收发socket消息来与Java程序通讯;Java程序通过中转消息Bundle的消息服务与C程序通讯。
[0015]根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:中转消息之间采用Unix域套接字进行通信。
[0016]根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:中转消息包括消息头和消息数据。
[0017]进一步地,根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:所述消息头包括源消息ID、目的消息ID、消息的类型和消息数据的长度。
[0018]进一步地,根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:C程序和Java程序在收到中转消息时会检查消息头字段,如果不符合消息头定义的,将视为非法消息,进行丢弃处理,并继续进行消息侦听。
[0019]根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:中转消息采用字节流进行发送接收。
[0020]根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:C程序的中转任务包括发送线程和接收线程,分别负责将消息发送至Java环境中,以及接收从Java环境中发来的消息。
[0021]根据上述的OSGi环境下Java和C的通信机制的实现方法,其中Java程序的中转任务作为一个OSGi的Bundle ;当所述Bundle激活时,将初始化发送连接和接收连接,并且发布消息服务。
[0022]根据上述的OSGi环境下Java和C的通信机制的实现方法,其中Java中转任务的接收线程和用户任务操作同一个消息接收对象实例;接收对象的消息写入和读取都是同步方法。
[0023]如上所述,本发明的OSGi环境下Java和C的通信机制的实现方法,具有以下有益效果:
[0024](I)本发明采用Unix域套接字,其本身也作为socket通信的一种方式,但又是进程间通信的一种方式,因此兼有通信的高效率和安全性;[0025](2) JNI的框架实现利用开源的JUDS (Java Unix Domain Sockets)库直接进行操作,从而省去了开发JNI的大量时间,同时又为JAVA与C通信提供了可靠的库支持;
[0026](3)利用开源的Apache Felix可以很好的实现OSGi框架下,各模块的交互管理,为C与Java通信环境搭建了很好的桥梁;
[0027](4 )本发明提出的通信协议可以实现可变数据、大批量字节流数据的传递,其高效率源自协议本身且并不复杂,且编码简单。
【专利附图】

【附图说明】
[0028]图1显示为本发明的OSGi环境下Java和C的通信机制的实现框架图;
[0029]图2显示为本发明中C环境下消息接收的流程图;
[0030]图3显示为本发明中建立socket的流程图;
[0031]图4显示为本发明中在缓存区内出现多条消息或者最后一条不完整时的处理方法流程图;
[0032]图5显示为本发明中消息接收对象实例的结构示意图。
【具体实施方式】
[0033]以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的【具体实施方式】加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。
[0034]需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。
[0035]OSGi的最原始目标就是针对嵌入式和家庭网关应用,但其对于模块化、组件导向以及服务导向也具有较完美的支持。比较著名的OSGi的框架有Equinox和Apache Felix等等。本发明选用Java库环境支持较好的Felix。Felix是一个OSGi版本4规范的Apache实现。Felix的操作简易,人性化的CLI命令接口可以方便的对OSGi环境下的Bundle进行组织管理。同时,OSGi本身也定义了 Bundle之间的通信,从而为中转消息带来方便,无需另外定义中转消息机制。
[0036]OSGi环境中包括中转消息模块,库组件模块,以及JavaApp的自定义模块。
[0037]其中,中转消息模块是本发明的核心Java模块,其中原理也是基于消息的收发整合,包括接收消息进程、发送消息接口、消息池、消息工厂等等。
[0038]库组件模块指cling、gstream这类的支持库,需要编成Bundle放到OSGi环境中。库组件模块是给JavaApp的基础运行和功能库。
[0039]JavaApp的自定义模块是运行在OSGi环境上的各个Java应用。
[0040]本发明的通信机制基于嵌入式的Iinux环境,搭载于VOS (Virtual OS)平台上,在Iinux下运行JVM,并植入OSGi环境中。C环境下不同任务之间的通信利用Iinux的消息队列实现Java环境下不同任务之间的通信利用OSGi框架提供的服务注册机制实现。[0041 ] 参照图1,OSGi环境下Java和C的通信机制如下:
[0042]在OSGi环境下注册中转消息Bundle,使Java程序能够使用消息服务,同时能响应C程序发送过来的消息;
[0043]C程序与中转消息Bundle建立通讯socket,或者Java程序通过向中转消息Bundle发起通讯请求,由中转消息Bundle建立与C程序的socket ;
[0044]C程序通过中转消息Bundle收发socket消息来与Java程序通讯;Java程序通过中转消息Bundle的消息服务与C程序通讯。
[0045]C环境和Java环境都有各种的中转任务进程,负责消息的解析转发。所有C环境下的任务如果想与Java环境下的任务通信,必须经过中转消息完成。中转消息之间的采用Unix域套接字通信。
[0046]在本发明中,OSGi和Iinux环境进程间通讯的中转消息采用消息头加消息数据的组织形式来完成通信需求。消息头部分能完成消息目的地址、消息类型、消息长度等解析,完成消息校验,从而保证中转消息能够正确被C和Java两端解析。由于该中转消息结构定义了基本的通信框架,故可以很方便地扩展到不同的通信需求上。
[0047]中转消息的具体结构见下表,其中表中的前4项为消息头的内容,第5项是消息数据的内容。
[0048]表1、中转消息的结构
[0049]
【权利要求】
1.一种OSGi环境下Java和C的通信机制的实现方法,其特征在于Java程序运行在OSGi框架下,C程序运行于Iinux系统上,所述实现方法至少包括: 在OSGi环境下注册中转消息Bundle,使Java程序能够使用消息服务,同时能响应C程序发送过来的消息; C程序与中转消息Bundle建立通讯socket,或者Java程序通过向中转消息Bundle发起通讯请求,由中转消息Bundle建立与C程序的socket ; C程序通过中转消息Bundle收发socket消息来与Java程序通讯;Java程序通过中转消息Bundle的消息服务与C程序通讯。
2.根据权利要求1所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:中转消息之间采用Unix域套接字进行通信。
3.根据权利要求1所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:中转消息包括消息头和消息数据。
4.根据权利要求3所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:所述消息头包括源消息ID、目的消息ID、消息的类型和消息数据的长度。
5.根据权利要求3所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:C程序和Java程序在收到中转消息时会检查消息头字段,如果不符合消息头定义的,将视为非法消息,进行丢弃处理,并继续进行消息侦听。
6.根据权利要求1所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:中转消息采用字节流进行发送接收。
7.根据权利要求1所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:C程序的中转任务包括发送线程和接收线程,分别负责将消息发送至Java环境中,以及接收从Java环境中发来的消息。
8.根据权利要求1所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:Java程序的中转任务作为一个OSGi的Bundle ;当所述Bundle激活时,将初始化发送连接和接收连接,并且发布消息服务。
9.根据权利要求1所述的OSGi环境下Java和C的通信机制的实现方法,其特征在于:Java中转任务的接收线程和用户任务操作同一个消息接收对象实例;接收对象的消息写入和读取都是同步方法。
【文档编号】H04L29/06GK103746959SQ201310637671
【公开日】2014年4月23日 申请日期:2013年11月27日 优先权日:2013年11月27日
【发明者】倪同贵, 邓兵, 施晨 申请人:上海斐讯数据通信技术有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1