查看源代码 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 类型: OctetStringInteger32Integer64Unsigned32Unsigned64Float32Float64GroupedEnumeratedAddressTimeUTF8StringDiameterIdentityDiameterURIIPFilterRuleQoSFilterRule

  • dictionary() = module() - 由 diameterc(1)diameter_make:codec/2 生成的生成字典模块的名称。字典模块提供的接口是一个可能会更改的实现细节。

  • header() = #diameter_header{} - Diameter 标头的记录表示。由 decode/2 返回的 packet() 中的值是从传入消息中提取的。在传递给 encode/2packet() 中设置的值会保留在编码后的 binary() 中,但 lengthcmd_codeapplication_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()] 列表等效于将 headeravps 字段设置为相应的值。

      警告

      msg 字段中的值并不意味着没有解码错误。还应检查 errors 字段。

    • bin = binary() - 编码前的传入消息或编码后的传出消息。

    • errors = [5000..5999 | {5000..5999, avp()}] - 在解码传入消息时检测到的错误,由相应的 5xxx 系列结果代码(永久性故障)标识。对于传入请求,应使用这些错误来制定适当的答案,如 diameter_apphandle_request/3 回调所记录。对于传入答案,diameter:application_opt() answer_errors 确定行为。

    • transport_data = term() - 对于相关的传输过程而言唯一的任意术语,如 diameter_transport 中所记录。

另请参阅

diameterc(1)diameter_appdiameter_dict(4)diameter_make

摘要

类型

diameterc(1)diameter_make:codec/2 生成的生成 字典模块 的名称。字典模块提供的接口是一个可能会更改的实现细节。

传递给 diameter:call/4 或从 handle_request/3 回调返回的 Diameter 消息的表示形式。

用于传入和传出 Diameter 消息的容器

函数

解码 Diameter 消息。

编码 Diameter 消息。

类型

此类型的链接

dictionary()

查看源代码 (未导出) (自 OTP R15B03 起)
-type dictionary() :: module().

diameterc(1)diameter_make:codec/2 生成的生成 字典模块 的名称。字典模块提供的接口是一个可能会更改的实现细节。

此类型的链接

message()

查看源代码 (自 OTP R15B03 起)
-type message() :: record() | maybe_improper_list().

传递给 diameter:call/4 或从 handle_request/3 回调返回的 Diameter 消息的表示形式。

此类型的链接

packet()

查看源代码 (自 OTP R15B03 起)
-type packet() ::
          #diameter_packet{header :: term(),
                           avps :: term(),
                           msg :: term(),
                           bin :: term(),
                           errors :: term(),
                           transport_data :: term()}.

用于传入和传出 Diameter 消息的容器

此类型的链接

record()

查看源代码 (未导出) (自 OTP R15B03 起)
-type record() :: term().

函数

此函数的链接

decode(Mod, Bin)

查看源代码 (自 OTP R15B03 起)
-spec decode(Mod, Bin) -> Pkt when Mod :: dictionary(), Bin :: binary(), Pkt :: packet().

解码 Diameter 消息。

此函数的链接

encode(Mod, Msg)

查看源代码 (自 OTP R15B03 起)
-spec encode(Mod, Msg) -> Pkt when Mod :: dictionary(), Msg :: message() | packet(), Pkt :: packet().

编码 Diameter 消息。