目录
1、0x38服务(RequestFileTransfer,请求文件传输服务)
Service description:
0x38服务(RequestFileTransfer,请求文件传输服务)被客户端用于初始化从客户端到服务端或者服务端到客户端的文件数据传输(下载或者上传)。另外,该服务有能力去获取文件系统的一些信息。
如果服务端实现了数据存储的文件系统,则该服务可以作为RequestDownload 和 RequestUpload服务的可替代的解决方案来支持数据上传或者下载功能。当配置文件系统的下载或者上传过程时,则应该使用RequestFileTransfer服务来替代。在服务端的文件系统中,该服务应该包含删除文件或者目录的功能。对于这个案例,TransferData 和 RequestTransferExit服务不适用。
在服务端已经接收到 RequestFileTransfer的请求报文之后,服务端在其发送肯定应答报文之前,应该采取必要的行为去接收或者传送数据。
2、请求报文格式
2.1 请求报文定义
下表定义了请求报文的格式:
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | RequestFileTransfer Request SID | M | 0x38 |
#2 | modeOfOperation | M | 0x01 - 0x05 |
#3 #4 | filePathAndNameLength [ byte#1 (MSB) byte#2] (LSB) | M M | 0x00 - 0xFF 0x00 - 0xFF |
#5 . . #5+n-1 | filePathAndName = [ byte#1 (MSB) . . byte#n ] | M . . C1 | 0x00 - 0xFF . . 0x00 - 0xFF |
#5+n | dataFormatIdentifier | C2 | 0x00 - 0xFF |
#5+n+1 | fileSizeParameterLength | C2 | 0x00 - 0xFF |
#5+n+2 . . #5+n+2+k-1 | fileSizeUnCompressed= [ byte#1 (MSB) . . byte#k ] | C2 . . C2,3 | 0x00 - 0xFF . . 0x00 - 0xFF |
#5+n+2+k . . #5+n+1+2k | fileSizeCompressed= [ byte#1 (MSB) . . byte#k ] | C2 . . C2,3 | 0x00 - 0xFF . . 0x00 - 0xFF |
C1:这个消息参数的长度(字节数)由 filePathAndNameLength 来定义。
C2:这些参数是否存在取决于 modeOfOperation 参数。
C3:这个消息参数的长度(字节数)由 fileSizeParameterLength 来定义。
2.2 请求报文中子函数参数定义
该服务未使用子函数参数。
2.3 请求报文中数据参数定义
该服务在请求报文中的数据参数定义如下表所示:
定义 |
---|
modeOfOperation 这个数据参数定义了文件或目录的操作类型,其在filePathAndName参数显示。这个参数值的定义如下表所示。 |
filePathAndNameLength 定义了参数 filePath的字节长度。 |
filePathAndName 定义了服务端中文件系统的位置,是增加,删除,替代或者是读取,取决于参数modeOfOperation。 另外,该参数包含了文件名,名字可以作为文件路径中的部分可以被增加,删除,替代或者是读取。 如果 modeOfOperation 参数值 = 0x05(ReadDir),该参数表示读取目录。 该参数的每个字节都应该按照ASCII格式来编码。 |
dataFormatIdentifier 该数据参数是单字节值,其每一位都可以单独编码。高位指定了压缩方法,低位指定了加密方法。0x00值表示既没有使用压缩方法,也没有使用加密方法。除了0x00之外的值都由汽车制造厂商指定。 如果 modeOfOperation 参数值等于0x02(删除文件) 和 0x05(读取目录),该参数则不应该出现在请求报文中。 |
fileSizeParameterLength 定义参数 fileSizeUncompressed 和 fileSizeCompressed 的字节长度。 如果 modeOfOperation 参数值等于0x02(删除文件),0x04(读取文件) 和 0x05(读取目录),该参数则不应该出现在请求报文中。 |
fileSizeUncompressed 定义未压缩文件的字节长度。 如果 modeOfOperation 参数值等于0x02(删除文件),0x04(读取文件) 和 0x05(读取目录),该参数则不应该出现在请求报文中。 |
fileSizeCompressed 定义压缩文件的字节长度。 如果传输未压缩的文件,则该参数的所有字节都应设置为参数fileSizeUncompressed中使用的大小信息。 如果 modeOfOperation 参数值等于0x02(删除文件),0x04(读取文件) 和 0x05(读取目录),该参数则不应该出现在请求报文中。 |
RequestFileTransfer服务请求报文中包含了 modeOfOperation 参数。该值定义如下表:
Byte Value | Description | 约定 |
---|---|---|
0x00 | ISO/SAE reserved ISO保留 | M |
0x01 | AddFile 该值被用来添加文件 | M |
0x02 | DeleteFile 该值被用来删除文件 | M |
0x03 | ReplaceFile 该值被用来替代文件。如果文件未储存,那么该文件应该被添加。 | M |
0x04 | ReadFile 该值被用来读取文件。如果文件未储存,那么该文件应该被添加。 | M |
0x05 | ReadDir 该值被用来读取目录。此值表示请求中不包含faileName。 | M |
0x06 - 0xFF | ISO/SAE reserved ISO保留。 | M |
3、肯定应答报文
3.1 肯定应答报文格式定义
字节序号 | 参数值 | 约定 | 字节值 |
---|---|---|---|
#1 | RequestFileTransfer Response SID | S | 0x78 |
#2 | modeOfOperation | M | 0x01 - 0x05 |
#3 | lengthFormatIdentifier | C1 | 0x00 - 0xFF |
#4 . . #4+(m-1) | maxNumberOfBlockLength = [ byte#1 (MSB) . . byte#m ] | C1,2 . . C1,2 | 0x00 - 0xFF . . 0x00 - 0xFF |
#4+m | dataFormatIdentifier | C1 | 0x00 - 0xFF |
#4+m+1 #4+m+2 | fileSizeOrDirInfoParameterLength [ byte#1 (MSB) byte#2 (LSB)] | C1 C1 | 0x00 - 0xFF 0x00 - 0xFF |
#4+m+3 . . #4+m+3+k-1 | fileSizeUncompressedOrDirInfoLength= [ byte#1 (MSB) . . byte#k ] | C1,3 . . C1,3 | 0x00 - 0xFF . . 0x00 - 0xFF |
#4+m+3+k . . #4+m+3+2k-1 | fileSizeUncompressedOrDirInfoLength= [ byte#1 (MSB) . . byte#k ] | C1,3 . . C1,3 | 0x00 - 0xFF . . 0x00 - 0xFF |
C1:这些参数是否存在取决于 modeOfOperation 参数。
C2:这个消息参数的长度(字节数)由 fileSizeOrDirInfoParameterLength 参数的定义。
C3:这个消息参数的长度(字节数)由 lengthFormatIdentifier 来定义。
3.2 肯定应答报文数据参数定义
下表定义了肯定应答报文中的数据参数:
定义 |
---|
modeOfOperation 此参数是请求值。 |
lengthFormatIdentifier 定义了 maxNumberOfBlockLength 参数的长度(字节数量)。 如果 modeOfOperation 参数值为0x02 (删除文件) ,那么该参数值不该包含在应答报文中。 |
maxNumberOfBlockLength 该参数被 requestFileTransfer 肯定应答报文用来通知客户端有多少的数据字节量(maxNumberOfBlockLength)包含在 TransferData 的请求报文中,或者去通知服务端有多少的数据字节量包含在 TransferData 肯定应答报文中,当上传数据时。这个长度反映了完整的消息长度,包含了服务标识符和出现在 TransferData 请求报文或者是肯定应答报文中的数据参数。该参数允许客户端在开始向服务端传输数据之前去适应服务端的接收缓冲区的大小,或者在上传的事件中显示出每个 TransferData 肯定应答报文中将包含多少个数据字节。服务端要求接收 transferData 的请求在长度上等于它汇报的 maxNumberOfBlockLength。服务端指定 transferData 请求长度应该小于接收的 maxNumberOfBlockLength 。 |
dataFormatIdentifier 该参数是请求值。如果 modeOfOperation 的值等于0x02(删除文件),则响应报文中不包括此参数。如果 modeOfOperation 的值等于0x05(读取目录),该参数值应该等于0x00。 |
fileSizeOrDirInfoParameterLength 以字节为单位,定义了待上传文件压缩文件的大小,或者待读取的目录信息的长度。如果 modeOfOperation 的值等于0x01(添加文件),0x02(删除文件) 或者 0x03 (取代文件),则应答报文中不包含此参数。 |
fileSizeUncompressedOrDirInfoLength 以字节为单位,定义了参数 fileSizeUncompressedOrDirInfoLength 和 fileSizeCompressed的长度。如果 modeOfOperation 的值等于0x01(添加文件),0x02(删除文件) 或者 0x03 (取代文件),则应答报文中不包含此参数。 |
fileSizeCompressed 以字节为单位,定义了压缩文件的长度。如果 modeOfOperation 的值等于0x01(添加文件),0x02(删除文件) 或者 0x03 (取代文件) 或者 0x05 (读取目录) ,则应答报文中不包含此参数。 |
4、支持的否定应答码(NRC_)
本服务实施了如下否定响应代码,下表记录了每个否定应答码发生的情况,如果服务端在错误场景使用了该服务,则应使用如下列出的否定响应码。
NRC | 描述 |
---|---|
0x13 | incorrectMessageLengthOrInvalidFormat 请求报文长度不正确时,会发送该NRC。 |
0x22 | conditionsNotCorrect 服务端接收到该服务的请求时,下载或者上传数据正在进行中,或者其他的条件不满足时执行该服务时,会发送该NRC。 |
0x31 | requestOutOfRange 以下情况会返回该NRC: — 指定的 dataFormatIdentifier 无效; — 指定的 modeOfOperation 无效; — 指定的 fileSizeParameterLength 无效; — 指定的 filePathAndNameLength 无效; — 指定的 fileSizeUncompressed 无效; — 指定的 fileSizeCompressed 无效; — 指定的 filePathAndName 无效; |
0x33 | securityAccessDenied 当该服务请求被接收时,服务端是保密的,会发送该NRC。 |
0x70 | uploadDownloadNotAccepted 由于某种错误,下载到服务端内存中的尝试无法完成,则返回该NRC。 |
0x38服务(RequestFileTransfer,请求文件传输服务)的否定应答码(NRC)具体处理过程如下。
5、0x38服务(RequestFileTransfer,请求文件传输服务)案例说明
Assumptions:
以下条款为该案例指定了如下条件。
下表定义了报文中的数据参数值:
Name | Values | Description |
---|---|---|
modeOfOperation | 0x01 | AddFile |
filePathAndNameLength | 0x001E | filePathAndName参数的长度为30 |
filePathAndName | “D:\mapdata\europe\germany1.yxz” | 路径包括了文件名称 |
dataFormatIdentifier | 0x11 | compressionMethod = 0x1X; encryptingMethod = 0xX1 |
fileSizeParameterLength | 0x02 | 文件长度和大小都是2个字节 |
fileSizeUncompressed | 0xC350 | 50KByte |
fileSizeCompressed | 0x7530 | 30KByte |
下表定义了 RequestFileTransfer 服务请求报文的案例,报文从客户端到服务端:
字节序号 | 描述 | 字节值 |
---|---|---|
#1 | RequestFileTransfer Request SID | 0x38 |
#2 | modeOfOperation | 0x01 |
#3 #4 | filePathAndNameLength [ byte#1 (MSB) byte#2] (LSB) | 0x00 0x1E |
#5 #6 #7 #8 #9 #10 #11 #12 #13 #14 #15 #16 #17 #18 #19 #20 #21 #22 #23 #24 #25 #26 #27 #28 #29 #30 #31 #32 #33 #34 | filePathAndName = [ byte#1 (MSB) byte#2 byte#3 byte#4 byte#5 byte#6 byte#7 byte#8 byte#9 byte#10 byte#11 byte#12 byte#13 byte#14 byte#15 byte#16 byte#17 byte#18 byte#19 byte#20 byte#21 byte#22 byte#23 byte#24 byte#25 byte#26 byte#27 byte#28 byte#29 byte#30 ] | 0x44 0x3A 0x5C 0x6D 0x61 0x70 0x64 0x61 0x74 0x61 0x5C 0x65 0x75 0x72 0x6F 0x70 0x65 0x5C 0x67 0x65 0x72 0x6D 0x61 0x6E 0x79 0x31 0x2E 0x79 0x78 0x7A |
#35 | dataFormatIdentifier | 0x11 |
#36 | fileSizeParameterLength | 0x02 |
#37 #38 | fileSizeUnCompressed= [ byte#1 (MSB) byte#2] | 0xC3 0x50 |
#39 #40 | fileSizeCompressed= [ byte#1 (MSB) byte#2] | 0x75 0x30 |
下表定义了 RequestFileTransfer 肯定应答报文的案例,报文从服务端到客户端:
字节序号 | 描述 | 字节值 |
---|---|---|
#1 | RequestDownload Response SID | 0x78 |
#2 | modeOfOperation | 0x01 |
#3 | lengthFormatIdentifier | 0x02 |
#4 #5 | maxNumberOfBlockLength = [ byte#1 (MSB) byte#m ] | 0xC3 0x50 |
#6 | dataFormatIdentifier | 0x11 |