查看源代码 diameter_codec (diameter v2.4.1)
Diameter 消息的解码和编码。
传入的 Diameter 消息在传递到 diameter_app
回调之前,会从 binary() 解码。同样,传出的 Diameter 消息在传递到适当的 diameter_transport
模块进行传输之前,会被编码为 binary()。此处记录的函数实现了默认的编码/解码。
警告
当使用
diameter:call/4
发送和接收消息以及diameter_app
中记录的回调接口时,diameter 用户无需在此处显式调用函数:diameter 本身会根据传递给diameter:start_service/2
的配置提供编码/解码,并且结果可能与此处记录的函数返回的结果不同,具体取决于配置。
下面的 header() 和 packet() 记录在 diameter.hrl 中定义,可以按如下方式包含。
-include_lib("diameter/include/diameter.hrl").
特定于应用程序的记录在字典文件编译生成的 hrl 文件中定义。
数据类型
uint8() = 0..255
uint24() = 0..16777215
uint32() = 0..4294967295
- 出现在 Diameter 和 AVP 标头中的 8 位、24 位和 32 位整数。avp() = #diameter_avp{}
- AVP 的应用程序中性表示。主要用于需要处理任意 Diameter 应用程序的中继应用程序。实现特定 Diameter 应用程序(为其配置字典)的服务可以操作 message() 类型的值。字段具有以下类型。
code = uint32()
is_mandatory = boolean()
need_encryption = boolean()
vendor_id = uint32() | undefined
- AVP 标头中的值,分别对应于 AVP 代码、M 标志、P 标志和供应商 ID。除undefined
之外的供应商 ID 表示设置了 V 标志。data = iolist()
- AVP 的数据字节。name = atom()
- AVP 的名称,如相关字典文件中所定义,如果 AVP 对于相关字典文件未知,则为undefined
。value = term()
- AVP 的解码值。如果无法解码数据字节、AVP 未知或者 解码格式 为none
,则在解码时为undefined
。解码值的类型如 diameter_dict(4) 中记录。type = atom()
- AVP 的类型,如相关字典文件(或其继承的字典文件)中所指定。可能的类型包括undefined
和 Diameter 类型:OctetString
、Integer32
、Integer64
、Unsigned32
、Unsigned64
、Float32
、Float64
、Grouped
、Enumerated
、Address
、Time
、UTF8String
、DiameterIdentity
、DiameterURI
、IPFilterRule
和QoSFilterRule
。
dictionary() = module()
- 由 diameterc(1) 或diameter_make:codec/2
生成的生成字典模块的名称。字典模块提供的接口是一个可能会更改的实现细节。header() = #diameter_header{}
- Diameter 标头的记录表示。由decode/2
返回的 packet() 中的值是从传入消息中提取的。在传递给encode/2
的 packet() 中设置的值会保留在编码后的 binary() 中,但length
、cmd_code
和application_id
除外,这些值全部由相关的 dictionary() 确定。注意
在传出消息中不必显式设置标头字段,因为 diameter 本身会设置适当的值。设置不适当的值对于测试目的可能很有用。
字段具有以下类型。
version = uint8()
length = uint24()
cmd_code = uint24()
application_id = uint32()
hop_by_hop_id = uint32()
end_to_end_id = uint32()
- Diameter 标头的版本、消息长度、命令代码、应用程序 ID、逐跳标识符和端到端标识符字段的值。is_request = boolean()
is_proxiable = boolean()
is_error = boolean()
is_retransmitted = boolean()
- 对应于 Diameter 标头的 R(请求)、P(可代理)、E(错误)和 T(可能重新传输的消息)标志的值。
message() = record() | maybe_improper_list()
- 传递给diameter:call/4
或从 handle_request/3 回调返回的 Diameter 消息的表示形式。记录表示形式如 diameter_dict(4) 中所述:字典文件中定义的消息编码为记录,每个组件 AVP 对应一个字段。等效地,消息也可以编码为列表,其头部是原子值消息名称(如相关字典文件中指定),其尾部是 AVP 名称/值对的列表,或键为 AVP 名称的值的映射。解码时的格式由 diameter:service_opt() decode_format 确定。在编码时接受任何格式。另一种列表值表示形式允许将消息指定为列表,其头部是 header(),其尾部是 avp() 列表。diameter 本身在根据 handle_request/3 回调的返回值指示中继请求时使用此表示形式。它与其他两个表示形式的不同之处在于,它绕过了对与相关字典中的定义不一致的消息的检查:消息会完全按照指定的方式发送。
packet() = #diameter_packet{}
- 用于传入和传出 Diameter 消息的容器。字段具有以下类型。header =
header()
| undefined
- 消息的 Diameter 标头。对于非中继应用程序中的传出消息,可以是(且通常应该是)undefined
,在这种情况下,diameter 会提供适当的值。avps = [
avp()
] | undefined
- 消息的 AVP。如果msg
字段设置为除undefined
之外的值,则对于传出消息会被忽略。msg =
message()
| undefined
- 传入/传出消息。对于传入消息,如果可以在非中继应用程序中解码消息,则为对应于配置的 解码格式 的术语,否则为undefined
。对于传出消息,设置[
header()
|
avp()
]
列表等效于将header
和avps
字段设置为相应的值。警告
msg
字段中的值并不意味着没有解码错误。还应检查errors
字段。bin = binary()
- 编码前的传入消息或编码后的传出消息。errors = [5000..5999 | {5000..5999, avp()}]
- 在解码传入消息时检测到的错误,由相应的 5xxx 系列结果代码(永久性故障)标识。对于传入请求,应使用这些错误来制定适当的答案,如diameter_app
中 handle_request/3 回调所记录。对于传入答案,diameter:application_opt()answer_errors
确定行为。transport_data = term()
- 对于相关的传输过程而言唯一的任意术语,如diameter_transport
中所记录。
另请参阅
摘要
类型
由 diameterc(1) 或 diameter_make:codec/2
生成的生成 字典模块 的名称。字典模块提供的接口是一个可能会更改的实现细节。
传递给 diameter:call/4
或从 handle_request/3 回调返回的 Diameter 消息的表示形式。
类型
-type dictionary() :: module().
由 diameterc(1) 或 diameter_make:codec/2
生成的生成 字典模块 的名称。字典模块提供的接口是一个可能会更改的实现细节。
-type message() :: record() | maybe_improper_list().
传递给 diameter:call/4
或从 handle_request/3 回调返回的 Diameter 消息的表示形式。
-type packet() :: #diameter_packet{header :: term(), avps :: term(), msg :: term(), bin :: term(), errors :: term(), transport_data :: term()}.
用于传入和传出 Diameter 消息的容器。
-type record() :: term().
函数
-spec decode(Mod, Bin) -> Pkt when Mod :: dictionary(), Bin :: binary(), Pkt :: packet().
解码 Diameter 消息。
-spec encode(Mod, Msg) -> Pkt when Mod :: dictionary(), Msg :: message() | packet(), Pkt :: packet().
编码 Diameter 消息。