现在开始使用Efficient XML的库测试 ISO15118-20命令的编解码是否正确,是否与EXICodec.jar的结果一致。
在本书的附录B中罗列了ISO15118-20的所有命令(json、xml、exi),感兴趣的读者可以使用这些命令自己进行编解码验证。
编写测试程序mytest20-all.c,对15118-2命令的原始xml文件编码得到exi文件,然后对exi文件进行解码生成xml文件。检查二者是否内容一致。
#include
#include
// This is the header file that defines the transcoding methods.
// It supersedes the use of libxml2-efx.h used in previous releases.
#include
// Implementation of a FNUserFill function to read bytes from a file
size_t FileFill(BYTE *buffer, int cnt, void *pvUserData)
{
// read cnt bytes from the FILE pointer in pvUserData.
// The FILE pointer was set in the call to EFXReaderInit()
return(fread(buffer, 1, cnt, (FILE *) pvUserData));
}
// FNUserFlush function to write the encoded data to a file
size_t FileFlush(BYTE *buffer, int cnt, void *pvUserData)
{
// write to the FILE pointer in pvUserData. This was set on EFXWriterInit() below
return(fwrite(buffer, 1, cnt, (FILE *) pvUserData));
}
static char defaultErrorMessage[32];
#define ERR_REPORT(err) printf("Error detected: %s\n", EFXLookupEFXERR(err, defaultErrorMessage));
#define ERRCHK(x) do{ if ((err=(x))) { ERR_REPORT(err) return(1); } } while(0)
static const char *cxsFileName = "../schema/iso15118_20.cxs";
//--------------------------SessionSetupReq + SessionSetupRes ------------------
static char * const xmlFileName_SessionSetupReq = "15118-20/SessionSetupReq.xml";
static char * const encodedFileName_SessionSetupReq = "15118-20/SessionSetupReq.xml.exi";
static char * const decodedFileName_SessionSetupReq = "15118-20/SessionSetupReq-exi-out.xml";
static char * const xmlFileName_SessionSetupRes = "15118-20/SessionSetupRes.xml";
static char * const encodedFileName_SessionSetupRes = "15118-20/SessionSetupRes.xml.exi";
static char * const decodedFileName_SessionSetupRes = "15118-20/SessionSetupRes-exi-out.xml";
//--------------------------AuthorizationSetupReq + AuthorizationSetupRes ------------------
static char * const xmlFileName_AuthorizationSetupReq = "15118-20/AuthorizationSetupReq.xml";
static char * const encodedFileName_AuthorizationSetupReq = "15118-20/AuthorizationSetupReq.xml.exi";
static char * const decodedFileName_AuthorizationSetupReq = "15118-20/AuthorizationSetupReq-exi-out.xml";
static char * const xmlFileName_AuthorizationSetupRes = "15118-20/AuthorizationSetupRes.xml";
static char * const encodedFileName_AuthorizationSetupRes = "15118-20/AuthorizationSetupRes.xml.exi";
static char * const decodedFileName_AuthorizationSetupRes = "15118-20/AuthorizationSetupRes-exi-out.xml";
//--------------------------CertificateInstallationReq + CertificateInstallationRes ------------------
static char * const xmlFileName_CertificateInstallationReq = "15118-20/CertificateInstallationReq.xml";
static char * const encodedFileName_CertificateInstallationReq = "15118-20/CertificateInstallationReq.xml.exi";
static char * const decodedFileName_CertificateInstallationReq = "15118-20/CertificateInstallationReq-exi-out.xml";
static char * const xmlFileName_CertificateInstallationRes = "15118-20/CertificateInstallationRes.xml";
static char * const encodedFileName_CertificateInstallationRes = "15118-20/CertificateInstallationRes.xml.exi";
static char * const decodedFileName_CertificateInstallationRes = "15118-20/CertificateInstallationRes-exi-out.xml";
//--------------------------AuthorizationReq + AuthorizationRes ------------------
static char * const xmlFileName_AuthorizationReq = "15118-20/AuthorizationReq.xml";
static char * const encodedFileName_AuthorizationReq = "15118-20/AuthorizationReq.xml.exi";
static char * const decodedFileName_AuthorizationReq = "15118-20/AuthorizationReq-exi-out.xml";
static char * const xmlFileName_AuthorizationRes = "15118-20/AuthorizationRes.xml";
static char * const encodedFileName_AuthorizationRes = "15118-20/AuthorizationRes.xml.exi";
static char * const decodedFileName_AuthorizationRes = "15118-20/AuthorizationRes-exi-out.xml";
//--------------------------ServiceDiscoveryReq + ServiceDiscoveryRes ------------------
static char * const xmlFileName_ServiceDiscoveryReq = "15118-20/ServiceDiscoveryReq.xml";
static char * const encodedFileName_ServiceDiscoveryReq = "15118-20/ServiceDiscoveryReq.xml.exi";
static char * const decodedFileName_ServiceDiscoveryReq = "15118-20/ServiceDiscoveryReq-exi-out.xml";
static char * const xmlFileName_ServiceDiscoveryRes = "15118-20/ServiceDiscoveryRes.xml";
static char * const encodedFileName_ServiceDiscoveryRes = "15118-20/ServiceDiscoveryRes.xml.exi";
static char * const decodedFileName_ServiceDiscoveryRes = "15118-20/ServiceDiscoveryRes-exi-out.xml";
//--------------------------ServiceDetailReq + ServiceDetailRes ------------------
static char * const xmlFileName_ServiceDetailReq = "15118-20/ServiceDetailReq.xml";
static char * const encodedFileName_ServiceDetailReq = "15118-20/ServiceDetailReq.xml.exi";
static char * const decodedFileName_ServiceDetailReq = "15118-20/ServiceDetailReq-exi-out.xml";
static char * const xmlFileName_ServiceDetailRes = "15118-20/ServiceDetailRes.xml";
static char * const encodedFileName_ServiceDetailRes = "15118-20/ServiceDetailRes.xml.exi";
static char * const decodedFileName_ServiceDetailRes = "15118-20/ServiceDetailRes-exi-out.xml";
//--------------------------ServiceSelectionReq + ServiceSelectionRes ------------------
static char * const xmlFileName_ServiceSelectionReq = "15118-20/ServiceSelectionReq.xml";
static char * const encodedFileName_ServiceSelectionReq = "15118-20/ServiceSelectionReq.xml.exi";
static char * const decodedFileName_ServiceSelectionReq = "15118-20/ServiceSelectionReq-exi-out.xml";
static char * const xmlFileName_ServiceSelectionRes = "15118-20/ServiceSelectionRes.xml";
static char * const encodedFileName_ServiceSelectionRes = "15118-20/ServiceSelectionRes.xml.exi";
static char * const decodedFileName_ServiceSelectionRes = "15118-20/ServiceSelectionRes-exi-out.xml";
//--------------------------DC_ChargeParameterDiscoveryReq + DC_ChargeParameterDiscoveryRes ------------------
static char * const xmlFileName_DC_ChargeParameterDiscoveryReq = "15118-20/DC_ChargeParameterDiscoveryReq.xml";
static char * const encodedFileName_DC_ChargeParameterDiscoveryReq = "15118-20/DC_ChargeParameterDiscoveryReq.xml.exi";
static char * const decodedFileName_DC_ChargeParameterDiscoveryReq = "15118-20/DC_ChargeParameterDiscoveryReq-exi-out.xml";
static char * const xmlFileName_DC_ChargeParameterDiscoveryRes = "15118-20/DC_ChargeParameterDiscoveryRes.xml";
static char * const encodedFileName_DC_ChargeParameterDiscoveryRes = "15118-20/DC_ChargeParameterDiscoveryRes.xml.exi";
static char * const decodedFileName_DC_ChargeParameterDiscoveryRes = "15118-20/DC_ChargeParameterDiscoveryRes-exi-out.xml";
//--------------------------ScheduleExchangeReq + ScheduleExchangeRes ------------------
static char * const xmlFileName_ScheduleExchangeReq = "15118-20/ScheduleExchangeReq.xml";
static char * const encodedFileName_ScheduleExchangeReq = "15118-20/ScheduleExchangeReq.xml.exi";
static char * const decodedFileName_ScheduleExchangeReq = "15118-20/ScheduleExchangeReq-exi-out.xml";
static char * const xmlFileName_ScheduleExchangeRes = "15118-20/ScheduleExchangeRes.xml";
static char * const encodedFileName_ScheduleExchangeRes = "15118-20/ScheduleExchangeRes.xml.exi";
static char * const decodedFileName_ScheduleExchangeRes = "15118-20/ScheduleExchangeRes-exi-out.xml";
//--------------------------PowerDeliveryReq + PowerDeliveryRes ------------------
static char * const xmlFileName_PowerDeliveryReq = "15118-20/PowerDeliveryReq.xml";
static char * const encodedFileName_PowerDeliveryReq = "15118-20/PowerDeliveryReq.xml.exi";
static char * const decodedFileName_PowerDeliveryReq = "15118-20/PowerDeliveryReq-exi-out.xml";
static char * const xmlFileName_PowerDeliveryRes = "15118-20/PowerDeliveryRes.xml";
static char * const encodedFileName_PowerDeliveryRes = "15118-20/PowerDeliveryRes.xml.exi";
static char * const decodedFileName_PowerDeliveryRes = "15118-20/PowerDeliveryRes-exi-out.xml";
//--------------------------AC_ChargeLoopReq + AC_ChargeLoopRes ------------------
static char * const xmlFileName_AC_ChargeLoopReq = "15118-20/AC_ChargeLoopReq.xml";
static char * const encodedFileName_AC_ChargeLoopReq = "15118-20/AC_ChargeLoopReq.xml.exi";
static char * const decodedFileName_AC_ChargeLoopReq = "15118-20/AC_ChargeLoopReq-exi-out.xml";
static char * const xmlFileName_AC_ChargeLoopRes = "15118-20/AC_ChargeLoopRes.xml";
static char * const encodedFileName_AC_ChargeLoopRes = "15118-20/AC_ChargeLoopRes.xml.exi";
static char * const decodedFileName_AC_ChargeLoopRes = "15118-20/AC_ChargeLoopRes-exi-out.xml";
//--------------------------SessionStopReq + SessionStopRes ------------------
static char * const xmlFileName_SessionStopReq = "15118-20/SessionStopReq.xml";
static char * const encodedFileName_SessionStopReq = "15118-20/SessionStopReq.xml.exi";
static char * const decodedFileName_SessionStopReq = "15118-20/SessionStopReq-exi-out.xml";
static char * const xmlFileName_SessionStopRes= "15118-20/SessionStopRes.xml";
static char * const encodedFileName_SessionStopRes = "15118-20/SessionStopRes.xml.exi";
static char * const decodedFileName_SessionStopRes = "15118-20/SessionStopRes-exi-out.xml";
static char* xmlFileName[][2] = {
{xmlFileName_SessionSetupReq, xmlFileName_SessionSetupRes},
{xmlFileName_AuthorizationSetupReq, xmlFileName_AuthorizationSetupRes},
{xmlFileName_CertificateInstallationReq, xmlFileName_CertificateInstallationRes},
{xmlFileName_AuthorizationReq, xmlFileName_AuthorizationRes},
{xmlFileName_ServiceDiscoveryReq, xmlFileName_ServiceDiscoveryRes},
{xmlFileName_ServiceDetailReq, xmlFileName_ServiceDetailRes},
{xmlFileName_ServiceSelectionReq, xmlFileName_ServiceSelectionRes},
{xmlFileName_DC_ChargeParameterDiscoveryReq, xmlFileName_DC_ChargeParameterDiscoveryRes},
{xmlFileName_ScheduleExchangeReq, xmlFileName_ScheduleExchangeRes},
{xmlFileName_PowerDeliveryReq, xmlFileName_PowerDeliveryRes},
{xmlFileName_AC_ChargeLoopReq,xmlFileName_AC_ChargeLoopRes},
{xmlFileName_SessionStopReq,xmlFileName_SessionStopRes}
};
static char* encodedFileName[][2] = {
{encodedFileName_SessionSetupReq, encodedFileName_SessionSetupRes},
{encodedFileName_AuthorizationSetupReq, encodedFileName_AuthorizationSetupRes},
{encodedFileName_CertificateInstallationReq, encodedFileName_CertificateInstallationRes},
{encodedFileName_AuthorizationReq, encodedFileName_AuthorizationRes},
{encodedFileName_ServiceDiscoveryReq, encodedFileName_ServiceDiscoveryRes},
{encodedFileName_ServiceDetailReq, encodedFileName_ServiceDetailRes},
{encodedFileName_ServiceSelectionReq, encodedFileName_ServiceSelectionRes},
{encodedFileName_DC_ChargeParameterDiscoveryReq, encodedFileName_DC_ChargeParameterDiscoveryRes},
{encodedFileName_ScheduleExchangeReq, encodedFileName_ScheduleExchangeRes},
{encodedFileName_PowerDeliveryReq, encodedFileName_PowerDeliveryRes},
{encodedFileName_AC_ChargeLoopReq, encodedFileName_AC_ChargeLoopRes},
{encodedFileName_SessionStopReq, encodedFileName_SessionStopRes}
};
static char* decodedFileName[][2] = {
{decodedFileName_SessionSetupReq, decodedFileName_SessionSetupRes},
{decodedFileName_AuthorizationSetupReq, decodedFileName_AuthorizationSetupRes},
{decodedFileName_CertificateInstallationReq, decodedFileName_CertificateInstallationRes},
{decodedFileName_AuthorizationReq, decodedFileName_AuthorizationRes},
{decodedFileName_ServiceDiscoveryReq, decodedFileName_ServiceDiscoveryRes},
{decodedFileName_ServiceDetailReq, decodedFileName_ServiceDetailRes},
{decodedFileName_ServiceSelectionReq, decodedFileName_ServiceSelectionRes},
{decodedFileName_DC_ChargeParameterDiscoveryReq, decodedFileName_DC_ChargeParameterDiscoveryRes},
{decodedFileName_ScheduleExchangeReq, decodedFileName_ScheduleExchangeRes},
{decodedFileName_PowerDeliveryReq, decodedFileName_PowerDeliveryRes},
{decodedFileName_AC_ChargeLoopReq, decodedFileName_AC_ChargeLoopRes},
{decodedFileName_SessionStopReq, decodedFileName_SessionStopRes}
};
int main(int argc, char** args){
char buf[80];
getcwd(buf, sizeof(buf));
printf("current working directory: %s\n", buf);
FILE *out1,*out2;
int exiDatalength;
int err;
EFXFactory * pFactory;
FILE *in, *out;
// this structure contains error information if parsing the XML input fails
EFXXMLParseError pError;
// allocate a new factory
ERRCHK(EFXFactoryAlloc(&pFactory));
// set the schema used to encode the data
ERRCHK(EFXFactorySetSchema(pFactory, 0, 0, cxsFileName));
// set properties to be same as in the settings file
EFXFactorySetProperty(pFactory, EFXPROPERTY_COMPRESSION, 0); // turning off compression makes output bit-aligned
int row = sizeof(xmlFileName)/sizeof(xmlFileName[0]);
int col = sizeof(xmlFileName[0])/sizeof(xmlFileName[0][0]);
printf("row=%d, col=%d \n", row, col);
printf(" sizeof(xmlFileName) = %d \n", sizeof(xmlFileName));
printf(" sizeof(xmlFileName[0]) = %d \n", sizeof(xmlFileName[0]));
printf(" sizeof(xmlFileName[0][0]) = %d \n", sizeof(xmlFileName[0][0]));
printf("xmlFileName[0] = %s, %s \n", xmlFileName[0][0], xmlFileName[0][1]);
//--------------------------SessionSetupReq + SessionSetupRes ------------------
for(int i=0; iEXI
in = fopen(xmlFileName[i][0], "r");
out = fopen(encodedFileName[i][0], "wb");
// convert the EXI encoded data into XML
ERRCHK(EFXTranscoderEncode(pFactory, FileFill, in, xmlFileName[i][0], FileFlush, out, &pError));
fclose(in);
fclose(out);
printf("fwrite %s ------ OK!\n",encodedFileName[i][0]);
// Req decode: EXI-> xml
printf("encodedFileName= %s \n",encodedFileName[i][0]);
printf("decodedFileName= %s \n",decodedFileName[i][0]);
in = fopen(encodedFileName[i][0], "rb");
out = fopen(decodedFileName[i][0], "w");
ERRCHK(EFXTranscoderDecode(pFactory, FileFill, in, FileFlush, out));
fclose(in);
fclose(out);
printf("fwrite %s ------ OK!\n",decodedFileName[i][0]);
//Res encode: xml->EXI ------------------------------------
in = fopen(xmlFileName[i][1], "r");
out = fopen(encodedFileName[i][1], "wb");
// convert the EXI encoded data into XML
ERRCHK(EFXTranscoderEncode(pFactory, FileFill, in, xmlFileName[i][1], FileFlush, out, &pError));
fclose(in);
fclose(out);
printf("fwrite %s ------ OK!\n",encodedFileName[i][1]);
// Res decode: EXI->xml
printf("encodedFileName= %s \n",encodedFileName[i][1]);
printf("decodedFileName= %s \n",decodedFileName[i][1]);
in = fopen(encodedFileName[i][1], "rb");
out = fopen(decodedFileName[i][1], "w");
ERRCHK(EFXTranscoderDecode(pFactory, FileFill, in, FileFlush, out));
fclose(in);
fclose(out);
printf("fwrite %s ------ OK!\n",decodedFileName[i][1]);
}
// Free memory associated with the factory
ERRCHK(EFXFactoryFree(pFactory));
}
运行后输出文件关系如下:
AuthorizationReq.xml: 原始xml文件
AuthorizationReq.exi: 原始的exi文件,这是用EXICodec.jar编码的结果
使用Efficient XML库对原始xml文件进行编解码:
AuthorizationReq.xml.exi: 经过Efficient XML编码生成的exi文件
AuthorizationReq-exi-out.xml: 对AuthorizationReq.xml.exi文件解码,重新生成的xml文件
另外作为对比,使用OpenEXI..jar工具同样对原始xml文件进行编解码,生成文件:
AuthorizationReq_encode.exi: 使用OpenEXI.jar编码生成的exi文件
AuthorizationReq_decode.xml: 使用OpenEXI.jar编码对原始xml解码,重新生成的xml文件
AuthorizationReq.xml_decode.xml: 使用使用OpenEXI.jar对AuthorizationReq.xml.exi解码,重新生成的额xml文件。
输出目录文件列表如下图:
编解码文件对比结果:
OpenEXI.jar和Efficient XML编码结果完全相同。
总共26条命令, 完全与EXICodec.jar编码结果相同的有22条命令,4条命令不相同。
详细结果如下:
XML文件 |
EXICodec.jar的编码EXI |
OpenEXI编码结果EXI |
Efficient XML编码结果EXI |
supportedAppProtocolReq |
71字节 |
71字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
71字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
supportedAppProtocolRes |
4字节 |
4字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
4字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
SessionSetupReq |
71字节 |
32字节,与EXICodec.jar的exi不同 自编自解OK 解码EXICodec.jar的exi Failed 解码Efficient XML的exi OK |
32字节, 与OpenEXI编码相同 自编自解 OK 解码EXICodec.jar的exi Failed 解码OpenEXI.jar的exi OK |
SessionSetupRes |
30字节 |
30字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi Failed |
30字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
AuthorizationSetupReq |
17字节 |
61字节,与EXICodec.jar的exi不同 自编自解OK 解码EXICodec.jar的exi Failed 解码Efficient XML的exi OK |
61字节, 自编自解 OK 解码EXICodec.jar的exi Failed 解码OpenEXI.jar的exi OK |
AuthorizationSetupRes |
38字节 |
38字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
38字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
CertificateInstallationReq |
1907字节 |
1799字节,与EXICodec.jar的exi不同 自编自解OK 解码EXICodec.jar的exi Failed 解码Efficient XML的exi OK |
1799字节, 自编自解 OK 解码EXICodec.jar的exi Failed 解码OpenEXI.jar的exi OK |
CertificateInstallationRes |
100字节 |
100字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
100字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
AuthorizationReq |
1870字节 |
1762字节,与EXICodec.jar的exi不同 自编自解OK 解码EXICodec.jar的exi Failed 解码Efficient XML的exi OK |
1762字节, 自编自解 OK 解码EXICodec.jar的exi Failed 解码OpenEXI.jar的exi OK |
AuthorizationRes |
19字节 |
19字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
19字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ServiceDiscoveryReq |
18字节 |
18字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
18字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ServiceDiscoveryRes |
22字节 |
22字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
22字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ServiceDetailReq |
19字节 |
19字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
19字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ServiceDetailRes |
79字节 |
79字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
79字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ServiceSelectionReq |
21字节 |
21字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
21字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ServiceSelectionRes |
19字节 |
19字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
19字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
DC_ChargeParameterDiscoveryReq |
40字节 |
40字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
40字节,与EXICodec.jar的exi相同 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
DC_ChargeParameterDiscoveryRes |
41字节 |
41字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
41字节,与EXICodec.jar的exi相同 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ScheduleExchangeReq |
44字节 |
44字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
44字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
ScheduleExchangeRes |
20字节 |
20字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
20字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
PowerDeliveryReq |
19字节 |
19字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
19字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
PowerDeliveryRes |
19字节 |
19字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
19字节, 自编自解 OK 解码EXICodec.jar的exi OK 解码OpenEXI.jar的exi OK |
AC_ChargeLoopReq V2G_CI_AC.xsd |
50字节 |
50字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
50字节,与EXICodec.jar的exi相同 自编自解 OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
AC_ChargeLoopRes |
30字节 |
30字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
30字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
SessionStopReq |
18字节 |
18字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
18字节, 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
SessionStopRes |
19字节 |
19字节,与EXICodec.jar的exi相同 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
19字节, 自编自解OK 解码EXICodec.jar的exi OK 解码Efficient XML的exi OK |
后面将分析命令编码不同的详细原因。