Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统
技术领域
本发明涉及计算机领域,更具体地,涉及一种Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统。
背景技术
随着汽车智能化的快速发展,SOMEIP协议被大量使用在车载ECU设备中进行车载以太网的数据通信,基于Android系统与车载ECU模块的通信也必须使用SOMEIP协议。
在用SOMEIP协议通信时,必须按照AUTOSAR标准进行数据序列化和反序列化工作,而目前车载以太网SOMEIP协议是使用C++语言开发,序列化和反序列化功能是以AUTOSAR架构为标准,针对C++数据结构实现,与Android系统java语言及数据结构不匹配,AUTOSAR也只是规定了C++语言的通信数据序列化标准,未规定java语言,所以,如何用java语言结合Android系统API实现C++SOMEIP协议的序列化和反序列化,满足AUTOSAR标准,与其他车载ECU模块通信是一个待解决的问题。
发明内容
本发明针对现有技术中存在的技术问题,提供一种Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统。
根据本发明的第一方面,提供了一种Android系统与汽车ECU模块通信数据序列化和反序列化方法,包括:在Android系统上,定义JNI封装数据互转接口,所述数据互转接口用于实现java类型数据和c++类型数据之间的转化;在序列化时,通过所述数据互转接口,将java类型数据转化为c++类型数据,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧;在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,通过所述数据互转接口,将c++类型数据转换成java类型数据,并返回给上层。
在上述技术方案的基础上,本发明还可以作出如下改进。
可选的,所述根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧,包括:根据AUTOSAR标准,查询到c++各级基本类型数据成员在通信数据帧中的位置,并逐一对各基本类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧。
可选的,所述在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,包括:在反序列化时,查询到java各基本类型数据成员在通信数据帧中的位置,并根据数据描述信息表中各基本类型数据成员的数据类型信息逐一对各基本类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧。
可选的,对于复杂类型数据的序列化和反序列化,将复杂类型数据的成员类型转换为java类型,并在class中定义,其中,java对象在JNI中类型用jobject类型代替;利用JNIEnv函数表中的函数取出jobject中的成员赋值给C++结构体,再进行序列化和反序列化。
可选的,所述复杂类型数据包括结构体类型数据和数组类型数据。
可选的,所述利用python脚本和jinja2模板自动生成序列化代码和反序列化代码。
可选的,所述利用python脚本加jinja2模板自动生成序列化代码和反序列化代码,包括:使用预先指定好的Excel表格或xml模板文件,接收并保存用户设计的数据结构;通过python语言编写的代码生成脚本读取数据结构表格或xml文件,生成json格式数据,将json格式数据输入预先制作的数据结构代码模板中,按照数据结构生成对应的代码,其中,所述数据结构代码模板为jinja2模板。
可选的,数据序列化和反序列化还包括:通过Android NDK工具编译JNI数据互转接口和C++文件生成arm、x86不同CPU架构的so库文件,添加入Android项目中依赖,实现Android系统与汽车ECU模块通过SOMEIP协议通信的数据序列化和反序列化。
根据本发明的第二方面,提供一种Android系统与汽车ECU模块通信数据序列化和反序列化系统,包括:定义模块,用于在Android系统上,定义JNI封装数据互转接口,所述数据互转接口用于实现java类型数据和c++类型数据之间的转化;序列化模块,用于在序列化时,通过所述数据互转接口,将java类型数据转化为c++类型数据,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧;反序列化模块,用于在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,通过所述数据互转接口,将c++类型数据转换成java类型数据,并返回给上层。
根据本发明的第三方面,提供了一种电子设备,包括存储器、处理器,所述处理器用于执行存储器中存储的计算机管理类程序时实现Android系统与汽车ECU模块通信数据序列化和反序列化方法的步骤。
根据本发明的第四方面,提供了一种计算机可读存储介质,其上存储有计算机管理类程序,所述计算机管理类程序被处理器执行时实现Android系统与汽车ECU模块通信数据序列化和反序列化方法的步骤。
本发明提供的一种Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统,通过在Android系统上封装定义JNI的数据互转接口,实现java类型数据与c++类型数据之间的转换,并基于AUTOSAR标准进行数据序列化和反序列化,实现在Android系统上与汽车ECU模块基于SOMEIP协议通信的数据序列化和反序列化。
附图说明
图1为本发明提供的一种Android系统与汽车ECU模块通信数据序列化和反序列化方法流程图;
图2为数据序列化流程示意图;
图3为数据反序列化流程示意图;
图4为结构体的序列化示意图;
图5为本发明提供的一种Android系统与汽车ECU模块通信数据序列化和反序列化系统结构示意图;
图6为本发明提供的一种可能的电子设备的硬件结构示意图;
图7为本发明提供的一种可能的计算机可读存储介质的硬件结构示意图。
具体实施方式
下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。以下实施例用于说明本发明,但不用来限制本发明的范围。
图1为本发明提供的一种Android系统与汽车ECU模块通信数据序列化和反序列化方法流程图,如图1所示,方法包括:101、在Android系统上,定义JNI封装数据互转接口,数据互转接口用于实现java类型数据和c++类型数据之间的转化;102、在序列化时,通过所述数据互转接口,将java类型数据转化为c++类型数据,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧;103、在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,通过所述数据互转接口,将c++类型数据转换成java类型数据,并返回给上层。
可以理解的是,由于在用SOMEIP协议通信时,必须按照AUTOSAR标准进行数据序列化和反序列化工作,目前车载以太网SOMEIP协议是使用C++语言开发,序列化和反序列化功能是以AUTOSAR架构为标准,针对C++数据结构实现,与Android系统java语言及数据结构不匹配,因此,有必要提出一种用java语言结合Android系统API实现C++SOMEIP协议的序列化和反序列化。
其中,Android系统使用java作为开发语言,在与C++应用程序基于SOMEIP协议数据通信的前提是解决java数据类型与C++数据类型的互转。所以,技术方案第一步利用JNI封装java基本数据类型和C++数据类型的互转接口,该互转接口可实现java数据类型和c++数据类型的相互转化。
在序列化时,通过互转接口,将java类型的数据转换为c++类型的数据,再根据AUTOSAR标准,对c++类型的数据进行序列化,形成第一SOMEIP协议通信数据帧。
在反序列时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,然后根据互转接口,将c++类型的数据转化为java类型的数据,并返回给上层应用层。
本发明通过在Android系统上封装定义JNI的数据互转接口,实现java类型数据与c++类型数据之间的转换,并基于AUTOSAR标准进行数据序列化和反序列化,实现在Android系统上与汽车ECU模块基于SOMEIP协议通信的数据序列化和反序列化。
在一种可能的实施例方式中,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧,包括:根据AUTOSAR标准,查询到c++各级基本类型数据成员在通信数据帧中的位置,并逐一对各基本类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧。
可以理解的是,在对数据进行序列化和反序列化之前,由于需要进行java类型数据和c++类型数据之间的互转,本实施例中利用JNI函数实现java数据类型与C++数据类型的互转。JNIEnv函数表中包含了所有java和JNI数据类型的转化函数,利用这些函数进行接口封装,并生成类型互转java本地方法。其中,如附录1所示,Java数据类型与C++基本数据类型对照表。
附录1:
在对数据进行序列化时,可参见图2,为序列化过程,首先通过互转接口将java类型转换成C++类型,再调用序列化函数生成SOMEIP协议通信数据帧。其中序列化函数要根据AUTOSAR标准,找到各级基本类型数据成员在通信数据中的位置,并逐一对各基本类型数据成员进行序列化,形成SOMEIP协议通信数据帧,实现数据的序列化。
在一种可能的实施例方式中,所述在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,包括:在反序列化时,查询到java各基本类型数据成员在通信数据帧中的位置,并根据数据描述信息表中各基本类型数据成员的数据类型信息逐一对各基本类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧。
可以理解的是,数据的反序列化过程可参见图3,具体的,首先通过反序列化函数将接收到的SOMEIP协议通信数据帧反序列化成C++数据类型,再通过Step1转换成java数据类型并返回给应用层。其中反序列化函数先找到各基本类型数据成员在通信数据帧中的位置,并根据该数据描述信息表中各基本类型数据成员的数据类型信息逐一对各基本类型数据成员进行反序列化,形成SOMEIP协议通信数据,实现数据的反序列化。
在一种可能的实施例方式中,可以理解的是,对于复杂类型数据的序列化和反序列化,例如结构体或数组类型的数据,java中没有此类型,要用class代替,结构体中的成员类型按照附录1的基本类型对照表转换成java类型,并在class中定义,java对象在JNI中类型用jobject类型代替,利用JNIEnv函数表中的函数取出jobject中的成员赋值给C++结构体,再进行序列化和反序列化,结构体的序列化过程请查看图4中的结构体序列化规范。
在一种可能的实施例方式中,可以理解的是,由于业务需要会涉及很多复杂类型数据,对于复杂类型数据,也是由基本数据类型构成,其序列化和反序列化函数会有大量重复的代码。对于重复的序列化和反序列化代码,利用python脚本加jinja2模板自动化生成序列化代码。
为提升开发效率,使用预先指定好的Excel表格或xml模板文件,接收并保存用户设计的数据结构。再通过python语言编写的代码生成脚本读取数据结构表格或xml文件,生成json格式数据,将数据输入预先制作的数据结构代码模板中,按照数据结构生成对应的代码。
最后,将工程中c++部分的代码通过Android NDK工具编译JNI数据互转接口和C++文件生成arm、x86不同CPU架构的so库文件,添加入Android项目中依赖,实现Android系统与汽车ECU模块通过SOMEIP协议通信的数据序列化和反序列化。
参见图5,提供了本发明的一种Android系统与汽车ECU模块通信数据序列化和反序列化系统,系统包括定义模块501、序列化模块502和反序列化模块503,其中:
定义模块501,用于在Android系统上,定义JNI封装数据互转接口,所述数据互转接口用于实现java类型数据和c++类型数据之间的转化;序列化模块502,用于在序列化时,通过所述数据互转接口,将java类型数据转化为c++类型数据,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧;反序列化模块503,用于在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,通过所述数据互转接口,将c++类型数据转换成java类型数据,并返回给上层。
可以理解的是,本发明实施例提供的Android系统与汽车ECU模块通信数据序列化和反序列化系统与前述各实施例提供的Android系统与汽车ECU模块通信数据序列化和反序列化方法相对应,Android系统与汽车ECU模块通信数据序列化和反序列化系统的相关技术特征可参考Android系统与汽车ECU模块通信数据序列化和反序列化方法的相关技术特征,在此不再赘述。
请参阅图6,图6为本发明实施例提供的电子设备的实施例示意图。如图6所示,本发明实施例提了一种电子设备600,包括存储器610、处理器620及存储在存储器610上并可在处理器620上运行的计算机程序611,处理器620执行计算机程序611时实现以下步骤:在Android系统上,定义JNI封装数据互转接口,所述数据互转接口用于实现java类型数据和c++类型数据之间的转化;在序列化时,通过所述数据互转接口,将java类型数据转化为c++类型数据,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧;在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,通过所述数据互转接口,将c++类型数据转换成java类型数据,并返回给上层。
请参阅图7,图7为本发明提供的一种计算机可读存储介质的实施例示意图。如图7所示,本实施例提供了一种计算机可读存储介质700,其上存储有计算机程序711,该计算机程序711被处理器执行时实现如下步骤:在Android系统上,定义JNI封装数据互转接口,所述数据互转接口用于实现java类型数据和c++类型数据之间的转化;在序列化时,通过所述数据互转接口,将java类型数据转化为c++类型数据,根据AUTOSAR标准,对c++类型数据成员进行序列化,形成第一SOMEIP协议通信数据帧;在反序列化时,对c++类型数据成员进行反序列化,形成第二SOMEIP协议通信数据帧,通过所述数据互转接口,将c++类型数据转换成java类型数据,并返回给上层。
本发明实施例提供的一种Android系统与汽车ECU模块通信数据序列化和反序列化方法及系统,通过在Android系统上封装定义JNI的数据互转接口,实现java类型数据与c++类型数据之间的转换,并基于AUTOSAR标准进行数据序列化和反序列化,实现在Android系统上与汽车ECU模块基于SOMEIP协议通信的数据序列化和反序列化。
需要说明的是,在上述实施例中,对各个实施例的描述都各有侧重,某个实施例中没有详细描述的部分,可以参见其它实施例的相关描述。
本领域内的技术人员应明白,本发明的实施例可提供为方法、系统、或计算机程序产品。因此,本发明可采用完全硬件实施例、完全软件实施例、或结合软件和硬件方面的实施例的形式。而且,本发明可采用在一个或多个其中包含有计算机可用程序代码的计算机可用存储介质(包括但不限于磁盘存储器、CD-ROM、光学存储器等)上实施的计算机程序产品的形式。
本发明是参照根据本发明实施例的方法、设备(系统)、和计算机程序产品的流程图和/或方框图来描述。应理解可由计算机程序指令实现流程图和/或方框图中的每一流程和/或方框、以及流程图和/或方框图中的流程和/或方框的结合。可提供这些计算机程序指令到通用计算机、专用计算机、嵌入式计算机或者其他可编程数据处理设备的处理器以产生一个机器,使得通过计算机或其他可编程数据处理设备的处理器执行的指令产生用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的装置。
这些计算机程序指令也可存储在能引导计算机或其他可编程数据处理设备以特定方式工作的计算机可读存储器中,使得存储在该计算机可读存储器中的指令产生包括指令装置的制造品,该指令装置实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能。
这些计算机程序指令也可装载到计算机或其他可编程数据处理设备上,使得在计算机或其他可编程设备上执行一系列操作步骤以产生计算机实现的处理,从而在计算机或其他可编程设备上执行的指令提供用于实现在流程图一个流程或多个流程和/或方框图一个方框或多个方框中指定的功能的步骤。
尽管已描述了本发明的优选实施例,但本领域内的技术人员一旦得知了基本创造概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本发明范围的所有变更和修改。
显然,本领域的技术人员可以对本发明进行各种改动和变型而不脱离本发明的精神和范围。这样,倘若本发明的这些修改和变型属于本发明权利要求及其等同技术的范围之内,则本发明也意图包括这些改动和变型在内。
- 上一篇:石墨接头机器人自动装卡簧、装栓机
- 下一篇:一种用于变电站的可视化远程部署方法