SomeIpXf产品参考手册
缩写词注解
缩写词 |
英文全称 |
中文解释 |
SOME/IP |
Scalable service-Oriented MiddlewarE over IP |
基于IP 的可缩放的面向服务的中间件 |
Service |
a logical combination of zero or more methods, zero or more events, and zero or more fields (empty service is allowed, e.g. for announcing non-SOME/IP services in SOME/IP-SD) |
由零个或多个 方法,零个或多个事件,零个 或多个Field组成的逻辑组合 |
Request |
a message of the client to the server invoking a method |
一条由客户端发出 的用于调用服务端方法的消息 |
Response |
a message of the server to the client transporting results of a method invocation |
一条由服 务端发送给客户端的消息,用 于传输客户端调用方法的结果 |
Method |
a method, procedure, function, or subroutine that is called/invoked |
方法或者函数。 |
简介
在发送端SOME/IP Transformer模块对数据进行线性化处理,将数据转换为符合SOME/IP格式要求的数据。
在接收端,SOME/IP Transformer模块将接收到的线性化的数据进行反序列化处理,将数据还原后提供给上层模块。
图1-1 SOME/IP Transformer模块概要图
参考资料
[1] AUTOSAR_SWS_SOMEIPTransformer.pdf,R19-11
[2] AUTOSAR_ASWS_TransformerGeneral.pdf,R19-11
功能描述
数据序列化功能
数据序列化功能介绍
对原始数据进行序列化。
数据序列化功能实现
根据配置工具中对接口(SenderReceiverInterface/ ClientServerInterface容器)和数据的描述(配置在DateTypeDescription页面中),SOME/IP Transformer模块会生成对应的序列化函数(根据SomeIpXfConfig配置项的配置生成),用户调用该序列化函数,提供对应的参数,该序列化函数输出序列化后的数据。
数据反序列化功能
数据反序列化功能介绍
对原始数据进行反序列化。
数据反序列化功能实现
根据配置工具中对接口(SenderReceiverInterface/ ClientServerInterface容器)和数据的描述(配置在DateTypeDescription页面中),SOME/IP Transformer模块会生成对应的反序列化函数(根据SomeIpXfConfig配置项的配置生成),用户调用该反序列化函数,提供对应的参数,该反序列化函数输出反序列化后的原始数据。
源文件描述
表3-1 SomeIpXf组件文件描述
文件 |
说明 |
SomeIpXf_Cfg.h |
定义SomeIpXf模块预编译时用到的配置参数。 |
SomeIpXf.c |
SomeIpXf模块源文件,包含了API函数的实现。 |
SomeIpXf.h |
SomeIpXf模块 头文件,包含了API函数的声明并定义了使用的数据结构。 |
图3-1 SomeIpXf组件文件交互关系图
API接口
类型定义
SomeIpXf_ConfigType类型定义
名称 |
SomeIpXf_ConfigType |
类型 |
Structure |
范围 |
无 |
描述 |
SomeIpXf初始化需要用到的数据,当前实现为空。 |
输入函数描述
输入模块 |
API |
Det |
Det_ReportError |
静态接口函数定义
SomeIpXf_<transformerId>函数定义(Sender/Receiver)
函数名称: |
SomeIpXf _<transformerId> |
||
函数原型: |
uint8 SomeIpXf_<transformerId>( uint8* buffer, uint16* bufferLength, const <type>* dataElement ) |
||
服务编号: |
0x03 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
dataElement |
值域: |
无 |
输入 输出参数: |
无 |
||
输出参数: |
buffer |
值域: |
无 |
bufferLength |
值域: |
无 |
|
返回值: |
uint8 |
0x00 (E_OK): 序列 化成功 0x81 ( E_SER_G ENERIC_ ERROR): 出 现错误 |
|
功能概述: |
该函数为Sender/R eceiver类型的序列 化函数,它将data element作为 输入,输出一个ui nt8类型的数组其中 包含序列化后的数 据。序列化后的数 据长度由序列化函 数计算,并输出在b ufferLength参数中 。该值可能比输出 buffer的长度小。 |
SomeIpXf_<transformerId>函数定义(Client/Server)
函数名称: |
SomeIpXf _<transformerId> |
||
函数原型: |
uint8 SomeIpXf_<transformerId>( const Rte_Cs_Transa ctionHandleType* T ransactionHandle, uint8* buffer, uint16* bufferLength, [Std_ReturnType returnValue,] <type> data_1, … <type> data_n ) |
||
服务编号: |
0x03 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
TransactionHandle |
值域: |
无 |
returnValue |
值域: |
STD_ON / STD_OFF |
|
data_1 |
值域: |
无 |
|
data_n |
值域: |
无 |
|
输入 输出参数: |
NONE |
||
输出参数: |
buffer |
值域: |
无 |
bufferLength |
值域: |
无 |
|
返回值: |
uint8 |
0x00 (E_OK): 序列 化成功 0x81 ( E_SER_G ENERIC_ ERROR): 出 现错误 |
|
功能概述: |
该函数为Client /Server类型的序列 化函数,它将data element作为 输入,输出一个ui nt8类型的数组其中 包含序列化后的数 据。序列化后的数 据长度由序列化函 数计算,并输出在b ufferLength参数中 。该值可能比输出 buffer的长度小。 |
SomeIpXf_<transformerId>函数定义(trigger event)
函数名称: |
SomeIpXf _<transformerId> |
||
函数原型: |
uint8 SomeIpXf_<transformerId>( uint8* buffer, uint16* bufferLength ) |
||
服务编号: |
0x03 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
无 |
||
输入 输出参数: |
无 |
||
输出参数: |
buffer |
值域: |
无 |
bufferLength |
值域: |
无 |
|
返回值: |
uint8 |
0x00 (E_OK): 序列 化成功 0x81 ( E_SER_G ENERIC_ ERROR): 出 现错误 |
|
功能概述: |
该函数为trigger even t类型的序列化函数 ,它将trigger作为 输入,输出一个ui nt8类型的数组其中 包含序列化后的数 据。序列化后的数 据长度由序列化函 数计算,并输出在b ufferLength参数中 。该值可能比输出 buffer的长度小。 |
SomeIpXf_Inv_<transformerId>函数定义 (Sender/Receiver)
函数名称: |
SomeIpXf_ Inv_<tran sformerId> |
||
函数原型: |
uint8 SomeIpXf_I nv_<trans formerId>( const uint8* buffer, uint16 buf ferLength, <type>* d ataElement ) |
||
服务编号: |
0x04 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
buffer |
值域: |
无 |
bu fferLength |
值域: |
0 .. 65535 |
|
输入 输出参数: |
无 |
||
输出参数: |
d ataElement |
值域: |
无 |
返回值: |
uint8 |
0x00 (E_OK): 反序列化成功 0x81 (E_SER_G ENERIC_ERROR): 出现一个错误 0x87 (E_ SER_WRONG_PROT OCOL_VERSION): 接收端的版本号 和发送端不匹配 0x88 (E_S ER_WRONG_INTER FACE_VERSION): 接口版本不支持 0x89 (E_SER_MALFO RMED_MESSAGE): 接收到 的消息长度不正 确,Xf无法处理 0x8a (E_SER_WRONG_ MESSAGE_TYPE): 接收到的 报文类型不正确 |
|
功能概述: |
Sen der/Receiv er通信的反 序列化函数 ,用于反序 列化SOME/ IP。该函数 接受一个包 含序列化数 据的uint8 类型的数组 作为输入, 输出原始数 据到RTE。 |
SomeIpXf_Inv_<transformerId>函数定义 (Client/Server)
函数名称: |
SomeI pXf_Inv_<tr ansformerId> |
||
函数原型: |
uint8 SomeIp Xf_Inv_<tra nsformerId>( Rte_Cs _Transaction HandleType* Transa ctionHandle, const uint8* buffer, uint16 b ufferLength, [Std_ ReturnType* r eturnValue,] [<type>* data_1,] … [<type>* data_n] ) |
||
服务编号: |
0x04 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
buffer |
值域: |
无 |
bufferLength |
值域: |
0 .. 65535 |
|
输入 输出参数: |
无 |
||
输出参数: |
Trans actionHandle |
值域: |
无 |
returnValue |
值域: |
无 |
|
data_1 |
值域: |
无 |
|
data_n |
值域: |
无 |
|
返回值: |
uint8 |
0x00 (E_OK): 反序列化成功 0x81 (E_SER_G ENERIC_ERROR): 出现一个错误 0x87 (E_ SER_WRONG_PROT OCOL_VERSION): 接收端的版本号 和发送端不匹配 0x88 (E_S ER_WRONG_INTER FACE_VERSION): 接口版本不支持 0x89 (E_SER_MALFO RMED_MESSAGE): 接收到 的消息长度不正 确,Xf无法处理 0x8a (E_SER_WRONG_ MESSAGE_TYPE): 接收到的 报文类型不正确 |
|
功能概述: |
Client/Serv er通信的反序 列化函数,用 于反序列化S OME/IP。该函 数接受一个包 含序列化数据 的uint8类型 的数组作为输 入,输出原始 数据到RTE。 |
SomeIpXf_Inv_<transformerId>函数定义 (trigger event)
函数名称: |
SomeI pXf_Inv_<tr ansformerId> |
||
函数原型: |
uint8 SomeIp Xf_Inv_<tra nsformerId>( const uint8* buffer, uint16 bufferLength ) |
||
服务编号: |
0x04 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
buffer |
值域: |
无 |
bufferLength |
值域: |
0 .. 65535 |
|
输入 输出参数: |
无 |
||
输出参数: |
无 |
||
返回值: |
uint8 |
0x00 (E_OK): 反序列化成功 0x81 (E_SER_G ENERIC_ERROR): 出现一个错误 0x87 (E_ SER_WRONG_PROT OCOL_VERSION): 接收端的版本号 和发送端不匹配 0x88 (E_S ER_WRONG_INTER FACE_VERSION): 接口版本不支持 0x89 (E_SER_MALFO RMED_MESSAGE): 接收到 的消息长度不正 确,Xf无法处理 0x8a (E_SER_WRONG_ MESSAGE_TYPE): 接收到的 报文类型不正确 |
|
功能概述: |
Trigger Eve nt通信的反序 列化函数,用 于反序列化S OME/IP。该函 数接受一个包 含序列化数据 的uint8类型 的数组作为输 入,输出原始 数据到RTE。 |
SomeIpXf_Init函数定义
函数名称: |
S omeIpXf_Init |
||
函数原型: |
void So meIpXf_Init( const SomeIpXf_ ConfigType* config ) |
||
服务编号: |
0x01 |
||
同步/异步: |
同步 |
||
是 否可重入: |
不可重入 |
||
输入参数: |
config |
值域: |
无 |
输入 输出参数: |
无 |
||
输出参数: |
无 |
||
返回值: |
无 |
||
功能概述: |
初始化So meIpXf模块。 |
SomeIpXf_DeInit函数定义
函数名称: |
SomeIpXf_DeInit |
函数原型: |
void SomeIpXf_DeInit( void ) |
服务编号: |
0x02 |
同步/异步: |
同步 |
是 否可重入: |
不可重入 |
输入参数: |
无 |
输入 输出参数: |
无 |
输出参数: |
无 |
返回值: |
无 |
功能概述: |
反初始化SomeIpXf模块。 |
SomeIpXf_GetVersionInfo函数定义
函数名称: |
SomeIpX f_GetVersionInfo |
||
函数原型: |
void SomeIpXf _GetVersionInfo( Std_V ersionInfoType* VersionInfo ) |
||
服务编号: |
0x00 |
||
同步/异步: |
同步 |
||
是 否可重入: |
可重入 |
||
输入参数: |
无 |
||
输入 输出参数: |
无 |
||
输出参数: |
VersionInfo |
值域: |
无 |
返回值: |
无 |
||
功能概述: |
获取Some IpXf模块的版本号 |
可配置函数定义
无。
配置
TransformationSet
图5-1 TransformationSet容器配置图
表5‑1 TransformationSet容器属性描述
UI名称 |
描述 |
|||
Transf ormati onTech nology |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
该容器用于定义 一个Transformer的属性 |
|||
依赖关系 |
无 |
TransformationTechnology
图5-2 TransformationTechnology容器配置图
表5‑2 TransformationTechnology容器属性描述
UI名称 |
描述 |
|||
Needs Origin alData |
取值范围 |
ON / OFF |
默认取值 |
OFF |
参数描述 |
表示transformer是否需 要访问SWC的原始数据。 |
|||
依赖关系 |
无 |
|||
Pr otocol |
取值范围 |
String |
默认取值 |
E2E |
参数描述 |
表示该 transformer实现的协议 |
|||
依赖关系 |
无 |
|||
Tran sforme rClass |
取值范围 |
CUSTOM / SAFETY / SECURITY / SERIALIZER |
默认取值 |
SAFETY |
参数描述 |
表 示该transformer的类型 |
|||
依赖关系 |
无 |
|||
V ersion |
取值范围 |
Int |
默认取值 |
1 |
参数描述 |
实现的协议版本号 |
|||
依赖关系 |
无 |
|||
S OMEIPT ransfo rmatio nDescr iption |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
该容器定义和 transformer相关的属性 |
|||
依赖关系 |
无 |
SOMEIPTransformationDescription
图5-3 SOMEIPTransformationDescription容器配置图
表5‑3 SOMEIPTransformationDescription容器属性描述
UI名称 |
描述 |
|||
ali gnment |
取值范围 |
1 .. 65535 |
默认取值 |
无 |
参数描述 |
表示动态长 度的数据的对其字节数 |
|||
依赖关系 |
无 |
|||
byt eOrder |
取值范围 |
mos tSignificantByteFirst / mo stSignificantByteLast /opaque |
默认取值 |
most Significan tByteFirst |
参数描述 |
表 示transformer的字节序 |
|||
依赖关系 |
无 |
|||
inte rfaceV ersion |
取值范围 |
1 .. 65535 |
默认取值 |
无 |
参数描述 |
版本号 |
|||
依赖关系 |
无 |
DataTypeDescription
图5-4 DataTypeDescription容器配置图
表5‑4 DataTypeDescription容器属性描述
UI名称 |
描述 |
|||
Type |
取值范围 |
VALUE(基本类型) ARRAY (定长数组) DYNAMIC ARRAY (动态长度数组) STRING (定长字符串) DYNAMIC STRING (动态长度字符串) STRUCT (结构体) UNION (联合体) |
默认取值 |
无 |
参数描述 |
定 义所描述的数据的类型 |
|||
依赖关系 |
1. Type参数设置为DYNAMIC
orageArrays容器中必须 配置StorageArray对象 2. Type 参数设置为UNION时,Un ionElements容器中必须 配置UnionElement对象 3. T ype参数设置为STRUCT时 ,SubElements容器中必 须配置SubElement对象 |
|||
Val ueType |
取值范围 |
boolean uint8 uint16 uint32 uint64 sint8 sint16 sint32 sint64 float32 |
默认取值 |
无 |
参数描述 |
表示所定义 的基本数据类型的类型 |
|||
依赖关系 |
仅在 Type=Value时可以配置 |
|||
Array Length |
取值范围 |
1 .. 65535 |
默认取值 |
无 |
参数描述 |
表示数组的长度 |
|||
依赖关系 |
仅在 Type=Array时可以配置 |
|||
St ringEn coding |
取值范围 |
UTF-8 / UTF-16 |
默认取值 |
UTF-8 |
参数描述 |
表示字符串的编码方式 |
|||
依赖关系 |
仅在Type=STRING / DYNAMIC ARRAY时可以配置 |
|||
String Length |
取值范围 |
1 .. 65535 |
默认取值 |
无 |
参数描述 |
表示字符串的长度 |
|||
依赖关系 |
仅在 Type=STRING时可以配置 |
|||
Arra yEleme ntType |
取值范围 |
引用 到DataTypeDescription |
默认取值 |
无 |
参数描述 |
表示数组成员的类型 |
|||
依赖关系 |
仅在 Type=Array时可以配置 |
|||
Refere ncedDa taType |
取值范围 |
引用 到DataTypeDescription |
默认取值 |
无 |
参数描述 |
表示是哪种类型的指针 |
|||
依赖关系 |
仅在Type=DATA REFERENCE时可以配置 |
|||
SubEl ements |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
表示结构体的子成员 |
|||
依赖关系 |
仅在 Type=STRUCT时可以配置 |
|||
Si zeIndi cators |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
动 态长度数组或动态长度 字符串表示长度的变量 |
|||
依赖关系 |
仅在Type=DYNAMIC ARRAY / DYNAMIC STRING时可以配置 |
|||
S torage Arrays |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
动 态长度数组或动态长度 字符串存储数据的数组 |
|||
依赖关系 |
仅在Type=DYNAMIC ARRAY / DYNAMIC STRING时可以配置 |
UnionElement
图5-5 UnionElement容器配置图
表5‑5 UnionElement容器属性描述
UI名称 |
描述 |
|||
UnionE lement |
取值范围 |
无 |
默认取值 |
无 |
参数描述 |
表示联合体 |
|||
依赖关系 |
无 |
MemberSelector
图5-6 MemberSelector容器配置图
表5‑6 MemberSelector容器属性描述
UI名称 |
描述 |
|||
Member Select orType |
取值范围 |
uint8/uint16/uint32 |
默认取值 |
无 |
参数描述 |
表示共用体的Mem berSelector的数据类型 |
|||
依赖关系 |
无 |
UnionMember
图5-7 UnionMember容器配置图
表5‑7 UnionMember容器属性描述
UI名称 |
描述 |
|||
Union Member |
取值范围 |
DataTypeDe scription中定义的类型 |
默认取值 |
无 |
参数描述 |
表示联合体中的各成员 |
|||
依赖关系 |
无 |
SubElement
图5-8 SubElement容器配置图
表5‑8 SubElement容器属性描述
UI名称 |
描述 |
|||
R eferen ceType |
取值范围 |
引用 到DataTypeDescription |
默认取值 |
无 |
参数描述 |
表示结构体成员的类型 |
|||
依赖关系 |
无 |
SizeIndicator
图5-9 SizeIndicator容器配置图
表5‑9 SizeIndicator容器属性描述
UI名称 |
描述 |
|||
R eferen ceType |
取值范围 |
uint8 / uint16 / uint32 |
默认取值 |
uint8 |
参数描述 |
表示存储动态长 度数组或动态长度字符 串的长度的变量的类型 |
|||
依赖关系 |
无 |
StorageArray
图5-10 StorageArray容器配置图
表5‑10 StorageArray容器属性描述
UI名称 |
描述 |
|||
Ar rayMax Length |
取值范围 |
1 .. 65535 |
默认取值 |
无 |
参数描述 |
表示存储动态 长度数组或动态长度字 符串的数组的最大长度 |
|||
依赖关系 |
无 |
SOMEIPTransformationISignalProps
图5-11 SOMEIPTransformationISignalProp容器配置图
表5‑11 SOMEIPTransformationISignalProp容器属性描述
UI名称 |
描述 |
|||
Inte rfaceV ersion |
取值范围 |
0 .. 65535 |
默认取值 |
无 |
参数描述 |
方法的版本号 |
|||
依赖关系 |
无 |
|||
Messa geType |
取值范围 |
Error / Notification / Request / RequestNoReturn / Response |
默认取值 |
无 |
参数描述 |
表 示Header中的消息类型 |
|||
依赖关系 |
无 |
|||
Sessi onHand lingSR |
取值范围 |
SessionHandlingActive / Se ssionHandlingInactive |
默认取值 |
无 |
参数描述 |
表示Sender/Receiver通 信中的session控制方式 |
|||
依赖关系 |
无 |
|||
SizeO fArray Length Fields |
取值范围 |
0 .. 65535 |
默认取值 |
无 |
参数描述 |
固定长度数组的Le ngthField占用的字节数 |
|||
依赖关系 |
无 |
|||
SizeOf Struct Length Fields |
取值范围 |
0 .. 65535 |
默认取值 |
无 |
参数描述 |
结构体的Le ngthField占用的字节数 |
|||
依赖关系 |
无 |
|||
SizeO fUnion Length Fields |
取值范围 |
0 .. 65535 |
默认取值 |
无 |
参数描述 |
共用体的Le ngthField占用的字节数 |
|||
依赖关系 |
无 |
SenderReceiverInterface
图5-12 SenderReceiverInterface容器配置图
表5‑12 SenderReceiverInterface容器属性描述
UI名称 |
描述 |
|||
DataE lement |
取值范围 |
Reference DataTypeDescription |
默认取值 |
无 |
参数描述 |
Se nderReceiverInterface 中的dataElement的类型 |
|||
依赖关系 |
无 |
ClientServerInterface
图5-13 SenderReceiverInterface容器配置图
表5‑13 SenderReceiverInterface容器属性描述
UI名称 |
描述 |
|||
Cli entSer verOpe ration |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
表示一个ClientServerI nterface中的Operation |
|||
依赖关系 |
无 |
ClientServerOperation
图5-14 ClientServerOperation容器配置图
表5‑14 ClientServerOperation容器属性描述
UI名称 |
描述 |
|||
arg uments |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
ClientSe rverOperation中的参数 |
|||
依赖关系 |
无 |
|||
po ssible Errors |
取值范围 |
Container |
默认取值 |
无 |
参数描述 |
ClientServer Operation中可能的错误 |
|||
依赖关系 |
无 |
Arguments
图5-15 ClientServerOperation容器配置图
表5‑15 ClientServerOperation容器属性描述
UI名称 |
描述 |
|||
Dir ection |
取值范围 |
IN / INOUT / OUT |
默认取值 |
无 |
参数描述 |
定 义参数的输入输出方向 |
|||
依赖关系 |
无 |
|||
Type |
取值范围 |
Reference DataTypeDescription |
默认取值 |
无 |
参数描述 |
定义参数的类型. |
|||
依赖关系 |
无 |
PossibleErrors
图5-16 possibleError容器配置图
表5‑16 possibleError容器属性描述
UI名称 |
描述 |
|||
Err orCode |
取值范围 |
0 .. 65535 |
默认取值 |
无 |
参数描述 |
定义可能出现的错误。 |
|||
依赖关系 |
无 |
SomeIpXfConfig
图5-17 SomeIpXfConfig容器配置图
表5‑17 SomeIpXfConfig容器属性描述
UI名称 |
描述 |
|||
S ervice Type |
取值范围 |
Client / Server |
默认取值 |
无 |
参数描述 |
表示SOMEIP Tr ansformer需要处理的对 象是Client还是Server |
|||
依赖关系 |
无 |
|||
C ommuni cation Type |
取值范围 |
Client-Server / Sender-Receiver / Trigger |
默认取值 |
无 |
参数描述 |
表示SOMEIP Transformer需要 处理的对象的通信方式 |
|||
依赖关系 |
无 |
|||
Dir ection |
取值范围 |
RECEIVE / SEND |
默认取值 |
无 |
参数描述 |
指示发送方向 |
|||
依赖关系 |
无 |
|||
csE rrorRe action |
取值范围 |
autonomous / applicationOnly |
默认取值 |
无 |
参数描述 |
指示错误处理方式 |
|||
依赖关系 |
无 |
|||
Client Server Interf aceRef |
取值范围 |
引用到本模块定义的 ClientServerInterface |
默认取值 |
无 |
参数描述 |
引用到 ClientServerInterface |
|||
依赖关系 |
Communication Type = Client-Server时可配置 |
|||
Se nderRe ceiver Interf aceRef |
取值范围 |
引用到本模块定义的Se nderReceiverInterface |
默认取值 |
无 |
参数描述 |
引用到Se nderReceiverInterface |
|||
依赖关系 |
Communication Type = Se nder-Receiver时可配置 |
|||
X frmTra nsform ationT echnol ogyRef |
取值范围 |
引用 到Xfrm模块中定义的Tra nsformationTechnology |
默认取值 |
无 |
参数描述 |
引用到Tra nsformationTechnology |
|||
依赖关系 |
无 |