首页> 中国专利> OSGi环境下Java和C的通信机制的实现方法

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通信环境搭建了很好的桥梁。

著录项

  • 公开/公告号CN103746959A

    专利类型发明专利

  • 公开/公告日2014-04-23

    原文格式PDF

  • 申请/专利权人 上海斐讯数据通信技术有限公司;

    申请/专利号CN201310637671.4

  • 发明设计人 倪同贵;邓兵;施晨;

    申请日2013-11-27

  • 分类号H04L29/06(20060101);

  • 代理机构31219 上海光华专利事务所;

  • 代理人余明伟

  • 地址 201616 上海市松江区广富林路4855弄20号、90号

  • 入库时间 2024-02-19 23:36:50

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2018-04-06

    授权

    授权

  • 2015-09-02

    实质审查的生效 IPC(主分类):H04L29/06 申请日:20131127

    实质审查的生效

  • 2014-04-23

    公开

    公开

说明书

技术领域

本发明涉及计算机通信的技术领域,特别是涉及一种OSGi环境下Java和C的通信机制的实现方法。

背景技术

Java语言的功能很强大,但不是万能的。在Java语言中,丢弃了指针这个功能强大且与底层交互密切的语言工具。单从效率层面上来讲,Java与C相比较,Java的执行效率远远低于C。对于一些算法要求比较高的,Java便不是最好的选择。Java是一种面向对象的语言,在各种纷繁复杂的APP应用中,Java备享赞誉,美名远播。这样就带来了Java与C共存协同合作的问题。Java的创造者们在开发之初就已经考虑到了这一点,在Java中提供了与C/C++的编程接口,这就是Java本机接口(Java Native Interface,JNI)。

Unix Domain Socket即Uinx域套接字,用于同一台机上运行的进程之间的通信。Unix域套接字的执行效率比因特网域的套接字更高,它是实现Java与C通信的桥梁。

Open Service Gateway Initiative,即OSGi(JSR291)亦称做Java语言的动态模块系统,它为模块化应用的开发定义了一个基础架构。简单的说,通过OSGi可以在后台对设备组件进行安装、升级或卸载而无需打断该设备的正常运行。OSGi作为Java模块化的载体,运行在Java虚拟机(Java Virtual Machine,JVM)之上。

现有技术中,解决Java程序和C程序之间的通信问题,通常采用的方式有如下几种:

(1)Socket通信方式

Socket是建立在传输协议(主要是TCP和UDP)上的一种套接字规范。套接字屏蔽了底层通信软件和具体操作系统的差异,使得任何两台安装了TCP协议软件和实现了要节制规范的计算机之间的通信成为可能。利用标准的Socket通信的方法,可以实现任何平台任何进程之间的Socket通信,从而实现信息的传递。然而,这种实现方案只能运行在任何两台安装了TCP协议的机器之间,利用网络套接字通信,而在其他环境下则无法运行及通信。

(2)文件共享方式

通信双方将需要传递的参数等信息,通过文件进行传递。然而,这种方法需要注意线程同步和安全等问题,而且其效率也相对比较低下。同时,由于该方式虽然较为简单易用,但是对文件的操作的安全性则成了通信的最大障碍。因此,在对效率要求比较高且对数据安全要求比较高的场合,这种方式便不可取了。

(3)通过JNI方式

JNI是编写Java本机方法和把JVM嵌入到本机应用程序中的标准接口。通过JNI编写程序,可以很方便的做到跨平台移植。采用JNI是目前为止较为流行的Java通信方式。单独使用JNI给JAVA与C之间的通信带来较大的灵活性。但是JNI本身只是一系列通用接口,其实现依赖于设计者本身的技术解决方案,因此带来不确定性。

综上所述,现有的方案的运行环境各异且各有优缺点,有的运行于不同主机,有的运行于JVM。OSGi是近年来新提出的标准,Java模块化是目前比较热门的发展趋势,因此在嵌入式平台下,OSGi环境中,提出一套Java与C的通信解决方案,同时能够解决通信安全、通信效率等问题则显得非常有必要。

发明内容

鉴于以上所述现有技术的缺点,本发明的目的在于提供一种OSGi环境下Java和C的通信机制的实现方法,使得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的通信机制的实现方法,其中:中转消息之间采用Unix域套接字进行通信。

根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:中转消息包括消息头和消息数据。

进一步地,根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:所述消息头包括源消息ID、目的消息ID、消息的类型和消息数据的长度。

进一步地,根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:C程序和Java程序在收到中转消息时会检查消息头字段,如果不符合消息头定义的,将视为非法消息,进行丢弃处理,并继续进行消息侦听。

根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:中转消息采用字节流进行发送接收。

根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:C程序的中转任务包括发送线程和接收线程,分别负责将消息发送至Java环境中,以及接收从Java环境中发来的消息。

根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:Java程序的中转任务作为一个OSGi的Bundle;当所述Bundle激活时,将初始化发送连接和接收连接,并且发布消息服务。

根据上述的OSGi环境下Java和C的通信机制的实现方法,其中:Java中转任务的接收线程和用户任务操作同一个消息接收对象实例;接收对象的消息写入和读取都是同步方法。

如上所述,本发明的OSGi环境下Java和C的通信机制的实现方法,具有以下有益效果:

(1)本发明采用Unix域套接字,其本身也作为socket通信的一种方式,但又是进程间通信的一种方式,因此兼有通信的高效率和安全性;

(2)JNI的框架实现利用开源的JUDS(Java Unix Domain Sockets)库直接进行操作,从而省去了开发JNI的大量时间,同时又为JAVA与C通信提供了可靠的库支持;

(3)利用开源的Apache Felix可以很好的实现OSGi框架下,各模块的交互管理,为C与Java通信环境搭建了很好的桥梁;

(4)本发明提出的通信协议可以实现可变数据、大批量字节流数据的传递,其高效率源自协议本身且并不复杂,且编码简单。

附图说明

图1显示为本发明的OSGi环境下Java和C的通信机制的实现框架图;

图2显示为本发明中C环境下消息接收的流程图;

图3显示为本发明中建立socket的流程图;

图4显示为本发明中在缓存区内出现多条消息或者最后一条不完整时的处理方法流程图;

图5显示为本发明中消息接收对象实例的结构示意图。

具体实施方式

以下通过特定的具体实例说明本发明的实施方式,本领域技术人员可由本说明书所揭露的内容轻易地了解本发明的其他优点与功效。本发明还可以通过另外不同的具体实施方式加以实施或应用,本说明书中的各项细节也可以基于不同观点与应用,在没有背离本发明的精神下进行各种修饰或改变。

需要说明的是,本实施例中所提供的图示仅以示意方式说明本发明的基本构想,遂图式中仅显示与本发明中有关的组件而非按照实际实施时的组件数目、形状及尺寸绘制,其实际实施时各组件的型态、数量及比例可为一种随意的改变,且其组件布局型态也可能更为复杂。

OSGi的最原始目标就是针对嵌入式和家庭网关应用,但其对于模块化、组件导向以及服务导向也具有较完美的支持。比较著名的OSGi的框架有Equinox和Apache Felix等等。本发明选用Java库环境支持较好的Felix。Felix是一个OSGi版本4规范的Apache实现。Felix的操作简易,人性化的CLI命令接口可以方便的对OSGi环境下的Bundle进行组织管理。同时,OSGi本身也定义了Bundle之间的通信,从而为中转消息带来方便,无需另外定义中转消息机制。

OSGi环境中包括中转消息模块,库组件模块,以及JavaApp的自定义模块。

其中,中转消息模块是本发明的核心Java模块,其中原理也是基于消息的收发整合,包括接收消息进程、发送消息接口、消息池、消息工厂等等。

库组件模块指cling、gstream这类的支持库,需要编成Bundle放到OSGi环境中。库组件模块是给JavaApp的基础运行和功能库。

JavaApp的自定义模块是运行在OSGi环境上的各个Java应用。

本发明的通信机制基于嵌入式的linux环境,搭载于VOS(Virtual OS)平台上,在linux下运行JVM,并植入OSGi环境中。C环境下不同任务之间的通信利用linux的消息队列实现;Java环境下不同任务之间的通信利用OSGi框架提供的服务注册机制实现。

参照图1,OSGi环境下Java和C的通信机制如下:

在OSGi环境下注册中转消息Bundle,使Java程序能够使用消息服务,同时能响应C程序发送过来的消息;

C程序与中转消息Bundle建立通讯socket,或者Java程序通过向中转消息Bundle发起通讯请求,由中转消息Bundle建立与C程序的socket;

C程序通过中转消息Bundle收发socket消息来与Java程序通讯;Java程序通过中转消息Bundle的消息服务与C程序通讯。

C环境和Java环境都有各种的中转任务进程,负责消息的解析转发。所有C环境下的任务如果想与Java环境下的任务通信,必须经过中转消息完成。中转消息之间的采用Unix域套接字通信。

在本发明中,OSGi和linux环境进程间通讯的中转消息采用消息头加消息数据的组织形式来完成通信需求。消息头部分能完成消息目的地址、消息类型、消息长度等解析,完成消息校验,从而保证中转消息能够正确被C和Java两端解析。由于该中转消息结构定义了基本的通信框架,故可以很方便地扩展到不同的通信需求上。

中转消息的具体结构见下表,其中表中的前4项为消息头的内容,第5项是消息数据的内容。

表1、中转消息的结构

32bit32bit32bit32bitMaxlen=512bitmsgSrcmsgDstmsgTypemsgDataLenmsgData

下面详细介绍一下各项的具体含义:

msgSrc:源消息ID,即发送进程的ID;

msgDst:目的消息ID,即接收进程的ID;

msgType:消息的类型,该项可以根据具体的通信需求详细定义;

msgDataLen:msgData字段的长度;

msgData:消息的内容。

整个中转消息结构体采用字节流进行发送接收,以便于进行消息解析。考虑到中转消息的校验机制,在收到中转消息时会检查消息头字段,如果不符合消息头定义的,将视为非法消息,会进行丢弃处理,并继续进行消息侦听。

C环境下用户任务的通信利用vos平台消息机制实现。该消息机制即沿用了linux系统提供的消息队列,对其进行了应用程序编程接口(Application Programming Interface,API)封装,方便使用。C环境下采用单进程或双线程的方式来完成消息的收发、解析和中转。每个进程单独负责发送消息和接收消息。采用这样的半双工方式通信可以很方便的组织代码,且不易产生错误。C环境的消息接收进程处于running状态,一旦侦听到消息,就会将其放到linux的消息队列之中,系统进程会根据消息的目的地址以及消息类型进行转发。

C环境下消息接收和发送都是利用Unix域套接字来实现。Unix域套接字仅仅复制数据,不负责协议处理,不需要添加删除网络头,因此,C代码下必须完成自定义的协议解析。C环境下消息接收流程如图2所示。C环境下发送消息时,首先建立socket,绑定到发送的socketfile,侦听socket,取得发送的socket fd。因为发送消息提供的为API接口,那么就必须先建立连接,取得发送socket描述符。当有需要往Java发送消息时,就调用该API。

参照图3,建立socket的流程如下:创建发送socket,绑定socket file,监听socket,并在建立连接后获取socket fd。另外发送线程在获取发送的socket fd之后,保存socket fd,并退出。在发送msg的时候,通过保存的socket fd调用标准的Unix域套接字发送函数send进行数据发送。

OSGi环境下有多个中转消息Bundle同时协同工作,他们之间的通信通过向OSGi注册消息服务实现。建立OSGi的框架Felix非常简单,只需要在Eclipse中建立Plug-in工程,并导入OSGi相关的库,分别建立消息中转模块,以及各类Java应用模块即可。在此不详细赘述。

Java中的任务提供用于发送和接收消息的消息服务时,采用以下方法:

(1)注册:声明本任务的消息ID,返回一个接收消息对象实例,接收消息对象提供了读取消息方法;

(2)发送:传入一个消息类的子类的实例。

其中,消息类提供以下接口:

a.得到消息目的ID;

b.得到消息源ID;

c.得到消息类型;

d.得到消息数据在socket上传递的字节流。

同时,消息类子类额外提供一组接口,以得到此消息的各个数据成员。

本发明中C和Java中的中转消息之间将使用两条连接,均为单向传输。为了保证效率并且保证健壮性,使用Unix域(AF_UNIX)的流连接(SOCK_STREAM)。Java为大端模式,而C的模式随系统不同有差异,因此要求C环境的程序在连接上传递时始终使用大端模式。C环境中的结构数据可能会出现对齐的空隙。为保证一致性,要求C环境程序在连接上传递时保证数据之间无间隙。因为使用了流连接,可能会出现读取数据时在缓存区内出现多条消息,或者最后一条不完整等情况,可使用如图4所示的机制进行处理。具体地,当缓存区数据长度小于消息头长度以及消息头长度与消息数据长度之和时,再提取消息,并将缓存区剩余数据移至缓存区头部,最后返回信息。

C的中转任务有两个线程,分别负责将消息发送至Java环境中,以及接收从Java环境中发来的消息,以下称为发送线程和接收线程。发送线程接收来自C任务的消息,转化后通过发送连接发送至Java中转任务。若发送连接不存在,则建立发送连接。接收线程监听连接请求,建立连接后,将接收数据转换为消息发送至C任务。

Java的中转任务也将作为一个OSGi的Bundle。此Bundle激活时,将初始化发送连接和接收连接,并且发布消息服务。此消息服务包括两个方法:

(1)发送消息

发送消息方法的机制类似C中发送进程,将用户的消息转化为流数据后发送给C中转任务。此方法调用完全在用户线程内进行,可能有多个用户线程同时使用,因此此方法被定义为同步方法。

(2)注册消息ID,返回一个接收消息对象实例,接收消息对象提供了读取消息方法。

用户任务调用注册方法后,中转任务将产生一个消息接收对象实例,并且绑定此实例与消息ID的对应关系,调用读取消息方法,即可获得消息。

Java的中转任务在激活时还将产生一个接收线程,用于接收来自C中转任务的消息。如果提取出一条完整的消息,产生一个消息对象实例,根据消息的目的ID找到对应的消息接收对象实例,调用它的写入消息方法,将此消息对象实例传递给此消息接收对象实例。

Java中转任务的接收线程和用户任务操作同一个消息接收对象实例,其中消息接收对象的实例如图5所示,因此必须引入同步机制。接收对象的消息写入和读取方法都是同步方法,消息读取方法发现当前消息为空时,使用函数wait(),消息写入方法中需要调用函数notifyall()。

基于Java和OSGi的特性,不推荐在Bundle之间使用消息接口。如果为了一致性需要支持Bundle之间的消息通信,需要对消息发送接口做修改:根据消息目的ID获取消息接收对象的实例,成功则往直接向此实例写入消息,否则转发至C中转任务。

综上所述,本发明的OSGi环境下Java和C的通信机制的实现方法采用Unix域套接字,兼有通信的高效率和安全性;采用的JNI的框架实现利用开源的JUDS库直接进行操作,从而省去了开发JNI的大量时间,同时又为JAVA与C通信提供了可靠的库支持;利用开源的Apache Felix可以很好的实现OSGi框架下,各模块的交互管理,为C与Java通信环境搭建了很好的桥梁;提出的通信协议可以实现可变数据、大批量字节流数据的传递,其高效率源自协议本身且并不复杂,且编码简单。所以,本发明有效克服了现有技术中的种种缺点而具高度产业利用价值。

上述实施例仅例示性说明本发明的原理及其功效,而非用于限制本发明。任何熟悉此技术的人士皆可在不违背本发明的精神及范畴下,对上述实施例进行修饰或改变。因此,举凡所属技术领域中具有通常知识者在未脱离本发明所揭示的精神与技术思想下所完成的一切等效修饰或改变,仍应由本发明的权利要求所涵盖。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号