第二章 EXI协议原理与实现--5 EXICodec.jar软件分析

5 EXICodec.jar编码软件分析

从本节开始,作者深入分析了与EXI有关的编码软件,对这些软件的编码结果进行测试,实测结果表明这些软件输出的EXI码流并不能通用,存在兼容性问题。 作者将对这些软件和测试过程进行详细介绍,并且与最通用的15118协议编解码器exicodec.jar进行了命令编码结果对比。

5.1 EXICodec.jar

exicodec.jar是在EVCC和SECC通信中最常用的EXI编解码器,jar包来自SwitchEV的开源代码:

https://github.com/SwitchEV/iso15118/tree/master/iso15118/shared

该jar包可以把Json格式命令编码成EXI,反编译后分析代码,发现内部编解码的途径:

Json<-->JAXBObject<--> XML<--> EXI

编码过程有两个主要步骤:

(1)从json格式字符串生成XML,主要是通过JAXB技术。JAXBObject 是基于 XML Schema 或 Java 类生成的实例,通过注解(如 @XmlRootElement、@XmlElement)与 XML 结构建立映射关系,实现数据绑定‌。

(2)根据XML编码和schema编码成EXI。 这一步使用了xsd模式文件。

反编译分析代码,EXICodec.jar包中的代码明显分为两部分:

从这里作者推断,EXICodec.jar包的开发者是在EXIficient项目基础上添加xsd模式语法后开发而成,核心还是使用了EXIficient的exi编码功能。

由于编码过程中涉及JAXBObject到XML的转换,因此转换过程消耗的时间较多。作者在嵌入式环境下实际测试经常出现通信命令收发超时,因此不适合嵌入式环境。

  • 在PC端运行,编解码常常是十几个毫秒。

  • 在嵌入式MCU(主频1GHz)运行,编解码常常是100+毫秒。

在python代码中调用方法:

复制代码
使用py4j库的JavaGateway方法启动jar包,实现python程序与JVM的连接:
self.exi_codec = self.gateway.jvm.com.siemens.ct.exi.main.cmd.EXICodec()


编解码exi字节流:
exi_stream  = self.exi_codec.encode(msg_content, protocol_ns)
exi_decoded = self.exi_codec.decode(exi_message, namespace)

由于这个包在SwitchEV项目中发布,后来又在Everest项目中继续使用,应用广泛,是个非常重要的编解码库。作者实测对各种ISO15118-2/20的命令的支持度非常好, 因此把这个包的编解码结果作为对比测试的基础,默认这个jar包的编解码是正确的。

5.2 exificient-gui.jar

开源代码:https://github.com/EXIficient/exificient-gui/tree

这是一个Java编写的GUI图形化工具,内部使用了开源EXIficient项目代码进行编解码。

作者并没有对这个工具进行测试, 感兴趣的读者可以自己研究。

相关推荐
快活林高老大2 天前
第二章 EXI协议原理与实现--7 Efficient XML编码分析(7.1~7.4)
iso15118·exi
快活林高老大2 天前
第二章 EXI协议原理与实现--7.5 Efficient XML库和OpenEXI.jar编解码交叉测试
iso15118·exi