CN115827278A - 跨模块通信方法、***、设备及存储介质 - Google Patents
跨模块通信方法、***、设备及存储介质 Download PDFInfo
- Publication number
- CN115827278A CN115827278A CN202211659027.2A CN202211659027A CN115827278A CN 115827278 A CN115827278 A CN 115827278A CN 202211659027 A CN202211659027 A CN 202211659027A CN 115827278 A CN115827278 A CN 115827278A
- Authority
- CN
- China
- Prior art keywords
- module
- function
- communication
- information
- called
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Computer And Data Communications (AREA)
Abstract
本公开实施例提供一种跨模块通信方法、***、设备及存储介质。当第一模块想要调用第二模块中的某个函数时,可以借助模块编程语言对应的运行时库将待调用函数的相关信息转换成可与消息中转模块通信的通信数据,从而可以利用消息中转模块将通信数据转发至第二模块,第二模块再借助运行时库对通信数据进行解析,得到待调用函数的相关信息,并基于该信息实现对待调用函数的调用。通过该方式,即可以实现跨模块通信。
Description
技术领域
本公开涉及通信技术领域,尤其涉及一种跨模块通信方法、***、设备及存储介质。
背景技术
通常,同一个应用程序内的多个模块之间,或不同应用程序之间均需要通信。比如,以口腔扫描软件为例,扫描软件中通常包括多个业务模块,比如,扫描业务模块、算法模块、授权模块等,这些业务模块在工作过程中均需要通信,因而,需要实现模块间的通信。
然而,有些场景下的模块之间无法直接通信,比如,运行在不同进程上的各模块之间,或者是同一进程下不同开发语言编写的各模块之间是无法直接通信的。因此,需要提供一种实现这些模块之间通信的方案。
发明内容
本公开提供一种跨模块通信方法、***、设备及存储介质。
根据本公开实施例的第一方面,提供一种跨模块通信方法,所述方法包括:
第一模块通过第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,并发送给预先创建的消息中转模块;其中,所述目标格式为各模块与所述消息中转模块通信需遵循的格式;
所述消息中转模块在接收到所述通信数据后,基于预先存储的通信函数的相关消息,确定与所述待调用函数关联的第二模块,并将所述通信数据转发给所述第二模块;其中,所述通信函数为模块之间通信需用到的函数;
所述第二模块通过第二运行时库对所述通信数据进行解析,得到所述待调用函数的相关信息,并基于所述待调用函数的相关信息对所述待调用函数进行调用。
根据本公开实施例的第二方面,提供一种跨模块通信***,所述***包括第一模块、第二模块和消息中转模块;
所述第一模块通过第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,并发送所述消息中转模块;其中,所述目标格式为各模块与所述消息中转模块通信需遵循的格式;
所述消息中转模块在接收到所述通信数据后,基于预先存储的通信函数的相关消息,确定与所述待调用函数关联的第二模块,并将所述通信数据转发给所述第二模块;其中,所述通信函数为模块之间通信需用到的函数;
所述第二模块通过第二运行时库对所述通信数据进行解析,得到所述待调用函数的相关信息,并基于所述待调用函数的相关信息对所述待调用函数进行调用。
根据本公开实施例的第三方面,提供一种电子设备,所述电子设备包括处理器、存储器、存储在所述存储器可供所述处理器执行的计算机指令,所述处理器执行所述计算机指令时,可实现上述第一方面提及的方法。
根据本公开实施例的第四方面,提供一种计算机可读存储介质,所述存储介质上存储有计算机指令,所述计算机指令被执行时实现上述第一方面提及的方法。
本公开实施例中,当第一模块想要调用第二模块中的某个函数时,可以借助模块编程语言对应的运行时库将待调用函数的相关信息转换成可与消息中转模块通信的通信数据,从而可以利用消息中转模块将通信数据转发至第二模块,第二模块再借助运行时库对通信数据进行解析,得到待调用函数的相关信息,并基于该信息实现对待调用函数的调用。通过该方式,即可以实现跨模块通信。
应当理解的是,以上的一般描述和后文的细节描述仅是示例性和解释性的,而非限制本公开。
附图说明
此处的附图被并入说明书中并构成本说明书的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。
图1是本公开实施例的一种跨模块通信方法的示意图。
图2是本公开实施例的一种跨模块通信方法的流程图。
图3是本公开实施例的一种模块之间跨语言通信的示意图。
图4是本公开实施例的一种模块向消息中转模块注册通信函数的示意图。
图5是本公开实施例的一种第一模块、第二模块运行在同一设备的应用场景示意图。
图6(a)-6(c)是本公开实施例中的第一模块、第二模块运行在不同设备的应用场景示意图。
图7(a)是本公开实施例中的模块A和模块B向Broker模块注册的示意图。
图7(b)是本公开实施例中模块A和模块B通过发布-订阅模式通信的示意图。
图7(c)是本公开实施例中模块A和模块B通过请求-应答模式通信的示意图。
图7(d)是本公开实施例中模块A和模块B通过回调-响应模式通信的示意图。
图8是本公开实施例的一种跨模块通信***的逻辑结构示意图。
图9是本公开实施例的一种设备的逻辑结构示意图。
具体实施方式
这里将详细地对示例性实施例进行说明,其示例表示在附图中。下面的描述涉及附图时,除非另有表示,不同附图中的相同数字表示相同或相似的要素。以下示例性实施例中所描述的实施方式并不代表与本公开相一致的所有实施方式。相反,它们仅是与如所附权利要求书中所详述的、本公开的一些方面相一致的装置和方法的例子。
在本公开使用的术语是仅仅出于描述特定实施例的目的,而非旨在限制本公开。在本公开和所附权利要求书中所使用的单数形式的“一种”、“所述”和“该”也旨在包括多数形式,除非上下文清楚地表示其他含义。还应当理解,本文中使用的术语“和/或”是指并包含一个或多个相关联的列出项目的任何或所有可能组合。另外,本文中术语“至少一种”表示多种中的任意一种或多种中的至少两种的任意组合。
应当理解,尽管在本公开可能采用术语第一、第二、第三等来描述各种信息,但这些信息不应限于这些术语。这些术语仅用来将同一类型的信息彼此区分开。例如,在不脱离本公开范围的情况下,第一信息也可以被称为第二信息,类似地,第二信息也可以被称为第一信息。取决于语境,如在此所使用的词语“如果”可以被解释成为“在……时”或“当……时”或“响应于确定”。
为了使本技术领域的人员更好的理解本公开实施例中的技术方案,并使本公开实施例的上述目的、特征和优点能够更加明显易懂,下面结合附图对本公开实施例中的技术方案作进一步详细的说明。
通常,同一个应用程序内的多个模块之间,或不同应用程序之间均需要通信。比如,模块A需要调用模块B的某个函数,以实现某个功能,或者模块A在完成某个任务后需要通知模块B,以便模块B执行下一步操作等。
以口腔扫描软件的开发为例,扫描软件中通常包括多个业务模块,比如,扫描业务模块、算法模块、授权模块等,这些业务模块在工作过程中均需要相互通信,因而,需要实现模块间的通信。
然而,有些场景下的模块之间无法直接通信,比如,运行在不同进程上的各模块之间,或者是同一进程下不同开发语言编写的各模块之间是无法直接通信的,无法直接对另一模块中的函数进行调用。因此,需要提供一种实现这些模块之间通信的方案。
考虑到在应用程序开发过程中,针对不同的编程语言,通常都存在一个程序运行时所依赖的运行时库(比如,iOS***原生语言的Runtime运行时库),该运行时库可以在程序运行期间动态的做一些函数上的处理,包括函数的调用,函数方法的拦截等,比如,该运行时库可以在利用该编程语言开发的应用程序运行的过程中,将该应用程序中实现某个功能的函数的函数名、函数的参数类型、参数值等信息转换成指定格式的通信数据,同时,该运行时库也可以将该指定格式的通信数据解析成函数的函数名、函数的参数类型、参数值等信息,并基于这些信息对该函数进行调用,以实现该函数的功能。因此,本公开实施例在设计模块之间的通信方案时,可以借助上述运行时库实现模块之间信息的传递。
比如,如图1所示,可以预先创建一个用于转发模块间通信信息的消息中转模块C,每个模块在启动后,均可以向该消息中转模块C注册该模块与其他模块通信所需用到的通信函数的相关信息。当某个模块A想要调用模块B中的某个函数X时,可以借助上述运行时库将函数X的函数名、参数类型、参数值等相关信息转换成可与该消息中转模块通信的通信数据,然后发送给消息中转模块,消息中转模块则可以基于各模块注册的通信函数的相关信息将通信数据转发给函数X对应的模块B。同理,模块B在接收到该通信数据后,也可以借助上述运行时库对通信数据进行解析,得到函数X的函数名、参数类型、参数值等相关信息,并利用上述运行时库基于这些信息对函数X进行调用,实现函数X的相关功能。通过上述方式,即可以实现不同模块之间的通信。
本公开实施例中的模块可以运行在进程、子进程或者线程上。从而可以实现跨进程通信、跨子进程通信或跨线程通信。
在一些场景,本公开实施例中相互通信的两个模块(以下称为第一模块和第二模块)可以运行在同一个设备上。
比如,这两个模块可以是运行在同一设备的不同应用程序中的两个模块,两个模块可以运行在两个应用程序对应的两个进程上,这种情况下,该跨模块通信方法可以由该设备执行,实现跨进程通信。
比如,这两个模块可以是同一应用程序中的两个模块,两个模块可以运行在该应用程序对应的两个进程上,这种情况下,该跨模块通信方法可以由该应用程序执行,实现跨进程通信。
比如,这两个模块可以是同一应用程序中的两个模块,这两个模块可以运行在该应用程序对应的两个子进程上。这种情况下,该跨模块通信方法可以由该应用程序执行,实现跨子进程通信。
比如,这两个模块可以是同一应用程序中不同开发语言编写的2个模块,这两个模块可以运行在该应用程序对应的进程的两个线程上。这种情况下,该跨模块通信方法可以由该应用程序执行,实现跨线程通信。
在一些场景,第一模块和第二模块可以运行在不同的设备上,比如,两个模块可以是两个应用程序,这两个应用程序分别运行在两个设备上。该跨模块通信方法可以由两个应用程序共同实现,实现跨进程通信。
如图2所示,为本公开实施例提供的跨模块通信方法的流程图,具体可以包括以下步骤:
S202、第一模块通过第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,并发送给预先创建的消息中转模块;其中,所述目标格式为各模块与所述消息中转模块通信需遵循的格式;
在应用程序启动后,可以创建一个消息中转模块,消息中转模块可以用于对不同模块之间的通信信息进行转发。在一些场景,若相互通信的第一模块和第二模块为同一个应用程序中的两个功能模块,则可以在该应用程序启动时,由该应用程序自动创建该消息中转模块。
在一些场景,若第一模块和第二模块为运行在两个不同设备上的两个模块,比如,这两个模块为两个应用程序,则可以由第一模块对应的应用程序启动时,创建该消息中转模块,或者由第二模块对应的应用程序启动时,创建该消息中转模块。
其中,各模块与消息中转模块之间可以基于预设的通信协议进行通信,比如,可以基于Mqtt(Message Queuing Telemetry Transport,消息队列遥测传输协议)协议、Xmpp(Extensible Messaging and Presence Protocol,可扩展通讯和表示协议)协议、Socket协议,Udp(User Datagram Protocol,用户数据报协议)协议等通信协议进行通信。以Mqtt协议为例,消息中转模块可以生成一个Mqtt服务器,作为不同模块之间通信的消息转发中心。
由于各模块之间的通信信息需要通过消息中转模块转发,因此,需要将通信信息的格式转换成可与该消息中转模块进行通信的数据格式。所以,在步骤S202中,当第一模块需要调用某个函数(以下称为待调用函数)时,可以借助第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,其中,待调用函数的相关信息可以是实现该函数调用有关的各类信息。目标格式是指各模块与该消息中转模块之间通信时,通信数据需遵循的格式,比如,该目标格式可以是字符串格式、XML格式、Jason格式等。
S204、所述消息中转模块在接收到所述通信数据后,基于预先存储的通信函数的相关消息,确定与所述待调用函数关联的第二模块,并将所述通信数据转发给所述第二模块;其中,所述通信函数为模块之间通信需用到的函数;
通常各功能模块在实现某个功能时,其需要和其他的哪些功能模块通信、和其他功能模块通信时用到的函数等信息都是已知的。所以,对于某个模块来说,该模块可以提供哪些函数给其他模块调用,并且需要调用其他模块的哪些函数等信息都是已知的。为了方便消息中转模块对通信数据进行转发,消息中转模块中可以预先存储各模块之间通信需要用到的通信函数的相关信息。其中,通信函数的相关信息可以用于指示各模块包括的可供其他模块调用的函数的信息,以及各模块需要调用的函数的信息。
在步骤S204中,消息中转模块在接收到第一模块发送的通信数据后,可以基于预先存储的通信函数的相关信息确定与该待调用函数关联的第二模块。由于通信函数的相关信息指示了各模块包括的可供其他模块调用的函数的信息,以及各模块需要调用的函数的信息,因此,可以根据通信函数的相关信息确定与该待调用函数关联的第二模块,比如,第二模块可以是包括该待调用函数的模块,然后消息中转模块可以将该通信数据转发给该第二模块。
S206、所述第二模块通过第二运行时库对所述通信数据进行解析,得到所述待调用函数的相关信息,并基于所述待调用函数的相关信息对所述待调用函数进行调用。
在步骤S206中,第二模块在接收到消息中转模块转发的通信数据后,可以借助第二运行时库对该通信数据进行解析,得到待调用函数的相关信息,比如,函数名、函数的参数类型、参数值等,然后可以基于解析得到的上述信息对待调用函数进行调用。
其中,第一运行时库可以是第一模块的编程语言对应的运行时库,第二运行时库可以是第二模块的编程语言对应的运行时库,两者可以相同,也可以不同。
比如,第一模块(或第二模块)的编程语言为iOS***的原生语言,第一运行时库(或第二运行时库)为Runtime运行时库,第一模块(或第二模块)的编程语言为C++语言或QT语言,第一运行时库(或第二运行时库)为QT元编程;第一模块(或第二模块)的编程语言为Java语言,第一运行时库(或第二运行时库)为Java反射机制(Reflection)。
通过上述方式,第一模块可以对第二模块中的函数进行调用,即可完成跨模块间的通信,进而可以实现各模块之间的高效协同工作。此外,针对一些场景,可以将不同的模块运行到不同的进程中,从而可以方便调试内存泄漏问题,也方便对引起的***崩溃的模块进行定位。
此外,由于每个模块可以是一个应用程序,或者是一个应用程序内的功能模块,而不同应用程序可能采用不同编程语言编写,或同一应用程序的不同功能模块可能采用不同编程语言编写,也就是说,需要通信的模块对应的编程语言可能不同。比如,有些模块可能是使用iOS***的原生语言(比如,Swift、Objective-C)编写得到,而有些模块可能是使用C++语言或Qt语言编写得到,两种语言无法直接通信。因此,在实现模块之间的通信时,如何实现跨语言通信也是一个亟待解决的问题。针对Qt语言(或C++)和iOS***的原生语言通信时,现有的解决方式是在原生语言与Qt语言间添加一层C语言作为通讯的媒介,原生语言与Qt通信的信息由C语言进行转发,比较繁琐。
为实现不同模块的跨语言通信,本公开实施例可以借助不同编程语言对应的运行时库实现不同编程语言的转换。比如,在一些实施例中,第一模块和第二模块可以采用不同的编程语言编写得到,比如,第一模块采用第一编程语言编写,第二模块采用第二编程语言编写。第一运行时库可以是和第一编程语言对应的运行时库,第二运行时库可以是和第二编程语言对应的运行时库。第一运行时库可以将采用第一编程语言编写的待调用函数的相关信息转换成通信数据,第二运行时库可以对通信数据进行解析,解析成采用第二编程语言编写的待调用函数的相关信息,然后再基于解析得到的信息对待调用函数进行调用。通过上述方式,即可以实现模块之间的跨语言通信。
举个例子,如图3所示,假设第一模块采用Objective-C语言编写,第二模块采用C++语言编写,第一运行时库可以是iOS***的原生语言的Runtime运行时库,第二运行时库可以是Qt元编程。第一模块可以通过Runtime运行时库将Objective-C语言的待调用函数的相关信息转换成通信数据,发送给消息中转模块,消息中转模块再转发给第二模块。第二模块则可以借助Qt元编程将该通信数据解析成C++语言的待调用函数,并对其进行调用。
通过上述方式,在实现跨模块的通信的同时,可以同时实现跨语言通信,比较便捷。并且,由于可以不需要通过中间层C语言进行不同语言的转换,可以减少开发工作量,提高开发效率,另外,也可以避免因C语言引入未知的Bug,增加出错的风险。
在一些实施例中,预先存储的通信函数的相关信息可以通过各模块向消息中转模块注册得到,比如,如图4所示,每个模块在启动后,可以向消息中转模块发送注册请求,注册请求中可以携带该模块的模块名称、以及该模块与其他模块通信所需用到的通信函数的各类信息,从而消息中转模块可以基于该注册请求携带的信息得到通信函数的相关信息。
此外,由于不同模块进行通信时,其要实现的目的不同,因而,模块之间可以采用不同的通信模式进行通信。举个例子,在有些场景,模块A需要指定模块B去完成某个任务,两者是一对一的模式,因此,两者通信可以采用请求-应答的通信模式。在有些场景,模块B、模块C、模块D等多个模块均需基于模块A对任务P的完成情况执行后续的操作,且无需向模块A返回任何信息,这种场景下,可以采用广播-订阅模式,即模块B、模块C、模块D均可以订阅模块A完成任务P的事件。在某些场景,模块A请求执行某个任务后,其不知道任务的执行方是谁,但是执行方执行完后需向模块A返回执行结果,这种场景下,则可以采用响应-回调模式。
在一些实施例中,针对不同的通信模式,各模块在向消息中转模块发送注册请求注册通信函数时,其需要向消息中转模块发送的信息也不同。
比如,针对任一模块,如果该模块与目标模块的通信模式为广播-订阅模式,则该模块向消息中转模块发送的注册请求中携带有订阅信息,该订阅信息用于指示该模块为目标模块调用指定通信函数的事件的订阅方。举个例子,如果模块A需订阅模块B调用通信函数X的事件,则模块A在启动后,可以向消息中转模块发送注册请求,该请求中携带订阅信息,订阅信息用于指示模块A订阅了模块B调用函数X的事件,其中,订阅信息可以通过各种方式表示,订阅信息需要说明该通信模式为订阅模式,订阅的是哪个模块调用哪个函数的事件。比如,模块A可以通过组合模块B的名字和函数X的名字来得到订阅信息。比如,订阅信息可以表示成如下:ProcessA-Pub/Sub-函数X-ProcessB。
如果该模块与目标模块的通信模式为请求-应答模式,则注册请求中可以携带请求信息或应答信息,请求信息用于指示该模块为调用目标模块中指定通信函数的事件的请求方。举个例子,如果模块A需调用模块B中的通信函数X,则模块A可以向消息中转模块发送注册请求,注册请求中携带请求信息,请求信息用于指示模块A需调用模块B中的函数X,即请求信息需说明模块A为请求方、需调用哪个模块中的哪个函数。比如,请求信息可以表示成如下:ProcessA-Rep-函数X-ProcessB。
同理,由于请求-应答模式是一对一模式,如果该模块为应答方,则该模块可以向消息中转模块发送携带应答信息的注册请求,该应答信息用于指示该模块为目标模块调用指定通信函数的事件的应答方。举个例子,如果模块A需调用模块B中的通信函数X,则模块B可以向消息中转模块发送注册请求,注册请求中携带应答信息,应答信息用于指示模块B中的函数X被模块A调用。即应答信息需说明模块B为应答方、模块B中哪个函数需要被哪个模块调用等。比如,应答信息可以表示成如下:ProcessB-Req-函数X-ProcessA。
消息中转模块在接收到模块A的请求信息和模块B的应答信息后,即可以将两个模块关联起来,得到与函数X关联的模块,以及模块之间的通信模式。
如果模块与目标模块的通信模式为回调-响应模式,则注册请求中携带有响应信息,该响应信息用于指示该模块为目标模块调用指定函数的事件的响应方。举个例子,如果模块A需调用某个模块中的通信函数X,模块A不知道通信函数是模块B的函数,但是模块B知道其需要响应模块A的调用。则模块B可以向消息中转模块发送注册请求,注册请求中携带响应信息,响应信息用于指示模块B需响应模块A调用函数X,即请求信息需说明模块B为响应方、需响应哪个模块对哪个函数的调用。比如,响应信息可以表示成如下:ProcessB-map/cab-函数X-ProcessA。
消息中转进行在接收各模块的注册请求后,即可以对注册请求中携带的信息进行整合,得到通信函数的相关信息。在一些实施例中,通信函数的相关信息包括:与各通信函数关联的模块的名称、与各通信函数关联的模块之间的通信模式;其中,通信模式包括以下任一模式:广播-订阅模式、请求-应答模式、回调-响应模式。由于消息中转模块需借助通信函数的相关信息确定需要将通信数据转发给哪个模块,因此,该相关信息中可以包括与每个通信函数关联的模块的名称。由于不同模块之间可以采用不同的通信模式进行通信,为了准确的确定和通信数据有关的模块,该相关信息中还可以包括每个通信函数关联的模块之间的通信模式,以便消息中转模块可以基于通信模式确定通信数据对应的模块。
在一些实施例中,消息中转模块在接收到第一模块发送的通信数据后,可以将通信数据转发给与待调用函数关联的模块。此时,针对不同的通信模式,其确定关联模块的方式也不同。
比如,如果消息中转模块在基于通信函数的相关信息确定待调用函数对应的通信模式为广播-订阅模式,则基于该相关信息确定订阅过第一模块调用该待调用函数事件的模块,并将这些模块作为第二模块。
如果基于通信函数的相关信息确定待调用函数对应的通信模式为请求-应答模式,则基于该相关信息确定第一模块调用该待调用函数事件的应答模块,并将该应答模块作为第二模块。
如果基于通信函数的相关信息确定待调用函数对应的通信模式为回调-响应模式,则基于该相关信息确定第一模块调用待调用函数事件的响应模块,将该响应模块作为第二模块。
在一些实施例中,第一模块与第二通信的通信模式为请求-应答模式或回调模式-响应模式,由于这两种模式下,第二模块在完成待调用函数的调用后,还需反馈执行结果。所以,第二模块在完成对待调用函数的调用后,第二模块还可以通过第二运行时库将执行结果反馈信息转换成该目标格式的通信数据,并发送给消息中转模块,由消息中转模块转发给第一模块。第一模块可以借助第一运行时库对该通信数据进行解析,得到该执行结果反馈信息,自此,则完成了对待调用函数的调用。
在一些实施例中,该待调用函数的相关信息可以包括以下一项或多项:函数名、函数的参数类型、函数的参数名、函数的参数数值、函数的参数数量。举个例子,假设待调用函数为实现打印功能的函数,该函数的函数名为“Print_函数”,函数的参数类型可以是要打印的数据的类型,比如,数字、字符串、文字等等。由于函数可以包括多个参数,为了区别这些参数,不同的参数可以通过参数名加以区分。函数的参数数值即可以是要打印的具体数据,比如“你好!”。
在一些实施例中,如图5所示,第一模块、第二模块和消息中转模块均为同一个应用程序中的模块,上述三个模块可以运行在应用程序对应的进程中的不同线程上,该消息中转模块在应用程序启动后创建。比如,应用程序在启动后,即会自动创建消息中转模块,后续每启动一个模块,该模块均可以向消息中转模块注册,向消息中转模块提交自身与其他模块通信所需用到的通信函数的相关信息。
在一些实施例中,第一模块和第二模块可以运行在不同设备上,该消息中转模块可以由运行第一模块的设备创建、或者,该消息中转模块可以由运行第二模块的设备创建、或者该消息中转模块可以由第三方设备创建,其中,第三方设备、运行第一模块的设备、运行第二模块的设备各不相同。
举个例子,如图6(a)-6(c)所示,第一模块对应应用程序APP1,运行在设备1上,第二模块对应应用程序AAP2,运行在设备2上,为了实现第一模块和第二模块之间的通信,可以是应用程序APP1启动后,即自动创建一个消息中转模块,用于作为第一模块和第二模块之间消息中转中心,如图6(a)。或者,也可以是在应用程序APP2启动后,即自动创建一个消息中转模块,用于作为第一模块和第二模块之间消息中转中心,如图6(b)。当然,也可以由不同于设备1和设备2的第三方设备创建消息中转模块,用于作为第一模块和第二模块之间消息中转中心,如图6(c)。其中,设备1、设备2、设备3之间可以通信网络连接,实现网络通信。
为了进一步解释本公开实施例提供的跨模块通信方法,以下结合一个具体的实施例加以解释。
在开发可在iOS***上运行的口腔扫描软件时,由于口腔扫描软件中通常包括扫描模块、算法模块、授权模块等多个业务模块,这多个业务模块在工作过程中均需要相互通信。由于iOS***中各模块通信还没有成熟的模块间通讯方案,因而开发了一种模块间通信的方案,具体包括以下步骤:
1、在该口腔扫描软件启动后,软件可以自动创建一个Broker模块,该Broker模块可以生成一个Mqtt服务器,作为不同模块间通信息的信息转发中心,其中,Broker模块和各模块之间可以基于Mqtt协议通信。
2、如图7(a)所示,各模块(比如,图中的模块A、模块B)中包括一个用于实现与其他模块通信的Tunnel模块,各模块在启动后,Tunnel模块可以向Broker模块注册该模块的模块名(比如,ProcessA、ProcessB),以及该模块与其他模块通信所需用到的通信函数的相关信息。其中,相关信息包括各通信函数的函数名、与各通信函数关联的模块的模块名、与各通信函数关联的模块之间的通信模式,比如,通信模式可以是广播-订阅模式、请求-应答模式、回调-响应模式。
3、在注册完后,当模块A需要调用通信函数X时,可以触发模块A中的Tunnel模块,Tunnel模块可以通过Runtime运行时库将通信函数X的函数名、函数中的参数名、参数类型、参数数值等信息转换成指定格式的通信数据,然后发送给Broker模块。Broker模块可以根据预先注册的通信函数的相关信息确定与函数X对应的模块B,然后转发给模块B。模块B在接收到通信数据后,模块B中的Tunnel模块可以借助Runtime运行时库对通信数据进行解析,得到通信函数X的函数名、函数中参数的参数名、参数类型、参数数值等信息,然后利用Runtime运行时库对函数X进行调用,即可完成函数X的调用。
此外,针对广播-订阅模式、请求-应答模式、回调-响应模式三种不同通信模式,其在注册和模块间通信过程存在一些差异,以下具体介绍。
(1)广播-订阅模式
如图7(b)所示,假设模块B需要订阅模块A调用用于实现X功能的函数X的事件,当模块B启动后,模块B可以向Broker模块发送注册请求,请求中携带模块A的模块名和函数X的函数名,比如,Broker模块可以记录:ProcessB-Pub/Sub-函数X-ProcessA。
当模块A需要实现X功能,触发tunnel模块调用函数X时,可以利用Runtime运行时库将函数X的函数名、参数类型、参数名、参数值转换成指定格式的广播信息,并发送给Broker模块,Broker模块可以找到订阅过该事件的模块B,并将该广播信息转发给模块B,模块B中的tunnel模块可以通过Runtime运行时库将广播信息解析成函数X的函数名、参数类型、参数名、参数值,并通过Runtime运行时库调用函数X。
(2)请求-应答模式
如图7(c)所示,假设模块A要调用模块B中的函数X,模块A知道模块B能够响应该请求,当模块A启动后,模块A可以向Broker模块发送注册请求,请求中携带模块B的模块名和函数X的函数名,比如,Broker模块可以记录:ProcessA-ReP-函数X-ProcessB。当模块B启动后,模块B可以向Broker模块发送注册请求,请求中携带模块A的模块名和函数X的函数名,比如,Broker模块可以记录:ProcessB-ReQ-函数X-ProcessA。
Broker模块接收到两者发送的注册请求后,可以将两者关联。
当模块A调用函数X时,Tunnel模块可以通过Runtime运行时库将函数X的函数名、参数类型、参数名、参数数值等转换成指定格式的请求信息,并发送给Broker,Broker基于请求信息确定模块B为应答方,将请求信息发送给模块B,模块B中的Tunnel模块可以通过Runtime运行时库解析该请求信息,并调用函数X。模块B在完成函数B的调用后,可以向模块A反馈执行结果。模块B可以通过Runtime运行时库将执行结果反馈信息转换成指定格式的应答信息,发送给Broker模块,Broker模块根据应答信息确认模块A为请求方,然后将应答信息返回给模块A,模块A可以借助通过Runtime运行时库对应答信息模块解析,得到执行结果,自此,完成对函数X的调用。
(3)回调-响应模式
如图7(d)所示,假设模块A要调用模块B中的函数X,模块A不需要知道模块B能够响应该调用请求,模块B知道模块A会发送回调消息。模块B在启动后,可以向Broker发送注册请求,请求中携带模块A的模块名和函数X的函数名;比如,Broker模块可以记录:Process-map/cab-函数X-ProcessA。
当模块A调用函数X时,Tunnel模块可以通过Runtime运行时库将函数X的函数名、参数类型、参数名、参数数值等转换成指定格式的请求信息,并发送给Broker模块,Broker通过该请求信息确认模块B为响应方,并将请求信息发送给模块B。模块B中的Tunnel模块通过Runtime运行时库解析请求信息,并调用函数X。模块B在完成函数X的调用后,需要向模块A反馈执行结果,模块B可以通过Runtime运行时库将执行结果反馈信息转换成指定格式的响应信息后,发送给Broker,Broker根据响应信息确认模块A为回调方,将响应信息返回给模块A,模块A可以借助通过Runtime运行时库对响应信息模块解析,得到执行结果,自此,完成对函数X的调用。
其中,如果模块A和模块B采用的是其他的编程语言,则可以将Runtime运行时库替换成其他编程语言对应的运行时库。比如,如果是QT或C++,则可以换成C++语言对应的运行时库。从而可以实现不用编程语言的模块之间的通信。
其中,不难理解,上述各实施例中的描述的方案在不存在冲突的情况,可以进行组合,本公开实施例中不一一例举。
相应的,本公开实施例还提供了一种跨模块通信***,如图8所示,所述***80包括:第一模块81、第二模块82和消息中转模块83;
所述第一模块通过第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,并发送所述消息中转模块;其中,所述目标格式为各模块与所述消息中转模块通信需遵循的格式;
所述消息中转模块在接收到所述通信数据后,基于预先存储的通信函数的相关消息,确定与所述待调用函数关联的第二模块,并将所述通信数据转发给所述第二模块;其中,所述通信函数为模块之间通信需用到的函数;
所述第二模块通过第二运行时库对所述通信数据进行解析,得到所述待调用函数的相关信息,并基于所述待调用函数的相关信息对所述待调用函数进行调用。
其中,上述***执行跨模块通信方法的具体步骤可以参考上述方法实施例中的描述,在此不再赘述。
进一步的,本公开实施例还提供一种设备,如图9所示,所述设备包括处理器91、存储器92、存储于所述存储器92可供所述处理器91执行的计算机指令,所述处理器91执行所述计算机指令时实现上述实施例中任一项所述的方法。
本公开实施例还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前述任一实施例所述的方法。
计算机可读介质包括永久性和非永久性、可移动和非可移动媒体可以由任何方法或技术来实现信息存储。信息可以是计算机可读指令、数据结构、程序的模块或其他数据。计算机的存储介质的例子包括,但不限于相变内存(PRAM)、静态随机存取存储器(SRAM)、动态随机存取存储器(DRAM)、其他类型的随机存取存储器(RAM)、只读存储器(ROM)、电可擦除可编程只读存储器(EEPROM)、快闪记忆体或其他内存技术、只读光盘只读存储器(CD-ROM)、数字多功能光盘(DVD)或其他光学存储、磁盒式磁带,磁带磁磁盘存储或其他磁性存储设备或任何其他非传输介质,可用于存储可以被计算设备访问的信息。按照本文中的界定,计算机可读介质不包括暂存电脑可读媒体(transitory media),如调制的数据信号和载波。
通过以上的实施方式的描述可知,本领域的技术人员可以清楚地了解到本公开实施例可借助软件加必需的通用硬件平台的方式来实现。基于这样的理解,本公开实施例的技术方案本质上或者说对现有技术做出贡献的部分可以以软件产品的形式体现出来,该计算机软件产品可以存储在存储介质中,如ROM/RAM、磁碟、光盘等,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开实施例各个实施例或者实施例的某些部分所述的方法。
上述实施例阐明的***、装置、模块或单元,具体可以由计算机芯片或实体实现,或者由具有某种功能的产品来实现。一种典型的实现设备为计算机,计算机的具体形式可以是个人计算机、膝上型计算机、蜂窝电话、相机电话、智能电话、个人数字助理、媒体播放器、导航设备、电子邮件收发设备、游戏控制台、平板计算机、可穿戴设备或者这些设备中的任意几种设备的组合。
本说明书中的各个实施例均采用递进的方式描述,各个实施例之间相同相似的部分互相参见即可,每个实施例重点说明的都是与其他实施例的不同之处。尤其,对于装置实施例而言,由于其基本相似于方法实施例,所以描述得比较简单,相关之处参见方法实施例的部分说明即可。以上所描述的装置实施例仅仅是示意性的,其中所述作为分离部件说明的模块可以是或者也可以不是物理上分开的,在实施本公开实施例方案时可以把各模块的功能在同一个或多个软件和/或硬件中实现。也可以根据实际的需要选择其中的部分或者全部模块来实现本实施例方案的目的。本领域普通技术人员在不付出创造性劳动的情况下,即可以理解并实施。
以上所述仅是本公开实施例的具体实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本公开实施例原理的前提下,还可以做出若干改进和润饰,这些改进和润饰也应视为本公开实施例的保护范围。
Claims (13)
1.一种跨模块通信方法,其特征在于,所述方法包括:
第一模块通过第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,并发送给预先创建的消息中转模块;其中,所述目标格式为各模块与所述消息中转模块通信需遵循的格式;
所述消息中转模块在接收到所述通信数据后,基于预先存储的通信函数的相关消息,确定与所述待调用函数关联的第二模块,并将所述通信数据转发给所述第二模块;其中,所述通信函数为模块之间通信需用到的函数;
所述第二模块通过第二运行时库对所述通信数据进行解析,得到所述待调用函数的相关信息,并基于所述待调用函数的相关信息对所述待调用函数进行调用。
2.根据权利要求1所述的方法,其特征在于,所述第一模块采用第一编程语言编写,所述第二模块采用不同于所述第一编程语言的第二编程语言编写;所述第一运行时库将采用所述第一编程语言编写的待调用函数的相关信息转换成所述通信数据,所述第二运行时库将所述通信数据解析成采用所述第二编程语言编写的待调用函数的相关信息。
3.根据权利要求1所述的方法,其特征在于,所述通信函数的相关信息通过以下方式得到:
在每个模块启动后,向所述消息中转模块发送注册请求,所述消息中转模块基于所述注册请求中携带的信息得到所述通信函数的相关信息。
4.根据权利要求3所述的方法,其特征在于,针对任一模块,
在该模块与目标模块的通信模式为广播-订阅模式的情况下,所述注册请求中携带有订阅信息,所述订阅信息用于指示该模块为目标模块调用指定函数的事件的订阅方;
在该模块与目标模块的通信模式为请求-应答模式的情况下,所述注册请求中携带请求信息或应答信息,所述请求信息用于指示该模块为对目标模块中指定函数进行调用的事件的请求方;所述应答信息用于指示该模块为目标模块对指定函数进行调用的事件的应答方;
在该模块与目标模块的通信模式为回调-响应模式的情况下,所述注册请求中携带有响应信息,所述响应信息用于指示该模块为目标模块调用指定函数的事件的响应方。
5.根据权利要求1-4任一项所述的方法,其特征在于,所述通信函数的相关信息包括:与各通信函数关联的模块的名称、与各通信函数关联的模块之间的通信模式;其中,所述通信模式包括以下任一模式:广播-订阅模式、请求-应答模式、回调-响应模式。
6.根据权利要求5所述的方法,其特征在于,在所述第一模块与所述第二模块的通信模式为请求-应答模式或回调模式-响应模式的情况下,在完成对所述待调用函数的调用后,所述第二模块还用于通过所述第二运行时库将执行结果反馈信息转换成所述目标格式的通信数据,并通过所述消息中转模块转发给所述第一模块;
所述第一模块还用于基于所述第一运行时库对接收到的通信数据进行解析,得到所述执行结果反馈信息。
7.根据权利要求1所述的方法,其特征在于,所述待调用函数的相关信息包括以下一项或多项:函数名、函数的参数类型、函数的参数名、函数的参数数值、函数的参数数量。
8.根据权利要求1所述的方法,其特征在于,所述第一模块、所述第二模块、所述消息中转模块运行在同一个应用程序对应的进程中的各线程上,所述消息中转模块在所述应用程序启动后创建。
9.根据权利要求1所述的方法,其特征在于,所述第一模块和所述第二模块运行在不同的设备上,所述消息中转模块通过以下任一方式创建得到:
由运行所述第一模块的设备创建;
由运行所述第二模块的设备创建;
由第三方设备创建,所述第三方设备、运行所述第一模块的设备、运行所述第二模块的设备各不相同。
10.根据权利要求1所述的方法,其特征在于,所述第一模块/所述第二模块的编程语言为iOS***的原生语言,所述第一运行时库/所述第二运行时库为Runtime运行时库;
所述第一模块/所述第二模块的编程语言为C++语言或QT语言,所述第一运行时库/所述第二运行时库为QT元编程;
所述第一模块/所述第二模块的编程语言为Java语言,所述第一运行时库/所述第二运行时库为Java反射机制。
11.一种跨模块通信***,其特征在于,所述***包括第一模块、第二模块和消息中转模块;
所述第一模块通过第一运行时库将待调用函数的相关信息转换成目标格式的通信数据,并发送所述消息中转模块;其中,所述目标格式为各模块与所述消息中转模块通信需遵循的格式;
所述消息中转模块在接收到所述通信数据后,基于预先存储的通信函数的相关消息,确定与所述待调用函数关联的第二模块,并将所述通信数据转发给所述第二模块;其中,所述通信函数为模块之间通信需用到的函数;
所述第二模块通过第二运行时库对所述通信数据进行解析,得到所述待调用函数的相关信息,并基于所述待调用函数的相关信息对所述待调用函数进行调用。
12.一种电子设备,其特征在于,所述电子设备包括处理器、存储器、存储于所述存储器可供所述处理器执行的计算机指令,所述处理器执行所述计算机指令时实现如权利要求1-10任一项所述的方法。
13.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质上存储有计算机程序,所述计算机程序被处理器执行时实现如权利要求1-10任一项所述的方法。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211659027.2A CN115827278A (zh) | 2022-12-22 | 2022-12-22 | 跨模块通信方法、***、设备及存储介质 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN202211659027.2A CN115827278A (zh) | 2022-12-22 | 2022-12-22 | 跨模块通信方法、***、设备及存储介质 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN115827278A true CN115827278A (zh) | 2023-03-21 |
Family
ID=85517839
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN202211659027.2A Pending CN115827278A (zh) | 2022-12-22 | 2022-12-22 | 跨模块通信方法、***、设备及存储介质 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN115827278A (zh) |
-
2022
- 2022-12-22 CN CN202211659027.2A patent/CN115827278A/zh active Pending
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN110365751B (zh) | 网关***的业务处理方法、装置及设备 | |
CN108255545B (zh) | 组件间的功能调用方法、装置及组件化架构*** | |
CN111212142A (zh) | 一种业务处理方法、集成开放对接平台及计算机存储介质 | |
CN114285793B (zh) | 一种分发方法、装置、设备和存储介质 | |
US20200210155A1 (en) | Systems and methods for integrating modules into a software application | |
CN109729121B (zh) | 一种云存储***及用于云存储***中实现自定义数据处理的方法 | |
CN110221840B (zh) | 应用程序的功能实现方法及装置、设备及存储介质 | |
CN109343970B (zh) | 基于应用程序的操作方法、装置、电子设备及计算机介质 | |
CN113691618A (zh) | 消息通知方法、装置、消息中心及存储介质 | |
CN114675982A (zh) | 一种业务集成***的数据获取通用方法及*** | |
CN111309407A (zh) | 集成第三方库的处理方法及装置 | |
CN112579212A (zh) | 跨语言调用的方法、调用方装置及被调用方装置 | |
CN115827278A (zh) | 跨模块通信方法、***、设备及存储介质 | |
CN115237481A (zh) | 驱动外接设备的方法、装置、设备及存储介质 | |
CN115480934A (zh) | 一种分布式数据处理的方法、装置、设备及储存介质 | |
CN113961194A (zh) | 基于Flutter跨应用的工程构建方法、***、终端及介质 | |
CN114925120A (zh) | 保险业务信息查询方法及相关设备 | |
CN109669793B (zh) | 中间件进程内对象调用方法 | |
CN114301970A (zh) | 服务调用方法、装置、电子设备及存储介质 | |
US8549537B2 (en) | Middleware bridge system and method | |
CN111401020A (zh) | 一种界面加载方法、***和计算设备 | |
CN117270833B (zh) | 服务调用及发布方法、介质和计算机设备 | |
CN117724726B (zh) | 一种数据处理方法和相关装置 | |
CN114237758B (zh) | 通信连接方法、装置、电子设备及计算机可读存储介质 | |
CN115878282A (zh) | 跨平台交互方法、装置及设备 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
PB01 | Publication | ||
PB01 | Publication | ||
SE01 | Entry into force of request for substantive examination | ||
SE01 | Entry into force of request for substantive examination |