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包中的代码明显分为两部分:
-
一部分来自开源EXIficient项目代码:https://github.com/EXIficient/exificient/tree/master
-
另一部分是新添加的generatedgrammar、grammars、message等目录,主要是对xsd文件解析后的语法规则文件。
从这里作者推断,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项目代码进行编解码。
作者并没有对这个工具进行测试, 感兴趣的读者可以自己研究。
