查看源代码 megaco_encoder 行为 (megaco v4.7)

Megaco 编码器行为。

以下函数应从 megaco_encoder 回调模块导出

数据类型

注意

请注意,(某些)这些记录的实际定义取决于所使用的 megaco 协议版本。 例如,'TransactionReply' 记录在版本 3 中有两个额外的字段,因此这里无法进行简单的 erlang 类型定义。

protocol_version() = integer()
segment_no()       = integer()
megaco_message() = #'MegacoMessage{}'
transaction() = {transactionRequest,     transaction_request()}      |
                {transactionPending,     transaction_reply()}        |
                {transactionReply,       transaction_pending()}      |
                {transactionResponseAck, transaction_response_ack()} |
                {segmentReply,           segment_reply()}
transaction_request() = #'TransactionRequest'{}
transaction_pending() = #'TransactionPending'{}
transaction_reply() = #'TransactionReply'{}
transaction_response_ack() = [transaction_ack()]
transaction_ack() = #'TransactionAck'{}
segment_reply() = #'SegmentReply'{}
action_request() = #'ActionRequest'{}
action_reply() = #'ActionReply'{}
command_request() = #'CommandRequest'{}
error_desc()   = #'ErrorDescriptor'{}

概述

类型

字母数字字符: A..Z | a..z

十进制数字: 0..9

在 Erlang 类型系统中无法正确表示此类型,因此这是我们能做的最好方式。

在 Erlang 类型系统中无法正确表示此类型,因此这是我们能做的最好方式。最小长度为 1,最大长度为 64。

TransactionReply 的问题在于其定义取决于我们正在使用的协议版本。 从版本 3 开始,它有两个额外的字段。

回调

执行 megaco 消息的最小解码。

编码 megaco 操作回复。 如果由于任何原因不支持此操作,则该函数应返回错误原因 not_implemented

编码 megaco 操作请求。 当用户调用函数 encode_actions/3 时,会调用此函数。 如果从未使用该函数,或者编解码器不支持此功能(单个操作的编码),则返回错误原因 not_implemented

编码 megaco 事务。 如果由于任何原因不支持此操作,则该函数应返回错误原因 not_implemented

类型

-type action_reply() :: {'ActionReply', _, _, _}.
-type action_request() :: {'ActionRequest', _, _, _, _}.
-type alpha() :: 65..90 | 97..122.

字母数字字符: A..Z | a..z

-type command_request() :: {'CommandRequest', _, _, _}.
-type deviceName() :: pathName().
-type digit() :: 48..57.

十进制数字: 0..9

-type domainName() :: #'DomainName'{name :: term(), portNumber :: term()}.
-type error_desc() :: #'ErrorDescriptor'{errorCode :: term(), errorText :: term()}.
-type ip4Address() :: #'IP4Address'{address :: term(), portNumber :: term()}.
-type ip6Address() :: #'IP6Address'{address :: term(), portNumber :: term()}.
-type megaco_message() :: #'MegacoMessage'{authHeader :: term(), mess :: term()}.
-type mtpAddress() :: octet_string().

在 Erlang 类型系统中无法正确表示此类型,因此这是我们能做的最好方式。

正确的定义将是: -type mtpAddress() :: octet_string(2..4).

-type octet() :: 0..255.
-type octet_string() :: [octet()].
-type pathName() :: [$* | alpha() | digit() | $_ | $/ | $$ | $@ | $- | $.].

在 Erlang 类型系统中无法正确表示此类型,因此这是我们能做的最好方式。最小长度为 1,最大长度为 64。

以下是 ABNF(从 megaco 标准复制)来填写空白

# pathNAME 的总长度不得超过 64 个字符。

pathNAME = ["*"] NAME *("/" / "*"/ ALPHA / DIGIT /"_" / "$" ) ["@" pathDomainName ]

# ABNF 允许两个或多个连续的“.”,尽管它在路径域名中没有意义。

pathDomainName = (ALPHA / DIGIT / "*" ) *63(ALPHA / DIGIT / "-" / "*" / ".")

NAME = ALPHA *63(ALPHA / DIGIT / "_" )

-type protocol_version() :: pos_integer().
-type segment_no() :: 0..65535.
-type segment_reply() ::
          #'SegmentReply'{transactionId :: term(),
                          segmentNumber :: term(),
                          segmentationComplete :: term()}.
-type transaction() ::
          {transactionRequest, transaction_request()} |
          {transactionPending, transaction_reply()} |
          {transactionReply, transaction_pending()} |
          {transactionResponseAck, transaction_response_ack()} |
          {segmentReply, segment_reply()}.
-type transaction_ack() :: #'TransactionAck'{firstAck :: term(), lastAck :: term()}.
-type transaction_pending() :: #'TransactionPending'{transactionId :: term()}.
-type transaction_reply() :: {'TransactionReply', _, _} | {'TransactionReply', _, _, _, _}.

TransactionReply 的问题在于其定义取决于我们正在使用的协议版本。 从版本 3 开始,它有两个额外的字段。

-type transaction_request() :: #'TransactionRequest'{transactionId :: term(), actions :: term()}.
链接到此类型

transaction_response_ack()

查看源代码
-type transaction_response_ack() :: [transaction_ack()].

回调

链接到此回调

decode_message(EncodingConfig, Version, Bin)

查看源代码
-callback decode_message(EncodingConfig, Version, Bin) -> {ok, Message} | Error
                            when
                                EncodingConfig :: list(),
                                Version :: protocol_version() | dynamic,
                                Bin :: binary(),
                                Message :: megaco_message(),
                                Error :: term().

解码 megaco 消息。

请注意,如果 Version 参数为 dynamic,则解码器应尝试从消息本身中找出实际版本,然后使用适当的解码器,例如版本 1。
另一方面,如果 Version 参数是整数,则表示这是消息的预期版本,并且应使用该版本的解码器。

链接到此回调

decode_mini_message(EncodingConfig, Version, Bin)

查看源代码
-callback decode_mini_message(EncodingConfig, Version, Bin) -> {ok, Message} | Error
                                 when
                                     EncodingConfig :: list(),
                                     Version :: protocol_version() | dynamic,
                                     Bin :: binary(),
                                     Message :: megaco_message(),
                                     Error :: term().

执行 megaco 消息的最小解码。

此函数的目的是对 Megaco 消息进行最小解码。 成功的结果是一个 'MegacoMessage',其中仅初始化了版本和 mid。 当 decode_message/3 函数无法找出消息的 mid(实际发送者)时,megaco_messenger 模块会使用此函数。

再次注意,成功的解码仅返回部分初始化的消息。

链接到此回调

encode_action_reply(EncodingConfig, Version, AR)

查看源代码 (可选)
-callback encode_action_reply(EncodingConfig, Version, AR) -> {ok, Bin} | {error, Reason}
                                 when
                                     EncodingConfig :: list(),
                                     Version :: protocol_version(),
                                     AR :: action_reply(),
                                     Bin :: binary(),
                                     Reason :: not_implemented | term().

编码 megaco 操作回复。 如果由于任何原因不支持此操作,则该函数应返回错误原因 not_implemented

当配置了分段时,将使用此函数。 因此,为了使此功能正常工作,必须完全支持此函数!

链接到此回调

encode_action_requests(EncodingConfig, Version, ARs)

查看源代码
-callback encode_action_requests(EncodingConfig, Version, ARs) -> {ok, Bin} | {error, Reason}
                                    when
                                        EncodingConfig :: list(),
                                        Version :: protocol_version(),
                                        ARs :: [action_request()],
                                        Bin :: binary(),
                                        Reason :: not_implemented | term().

编码 megaco 操作请求。 当用户调用函数 encode_actions/3 时,会调用此函数。 如果从未使用该函数,或者编解码器不支持此功能(单个操作的编码),则返回错误原因 not_implemented

链接到此回调

encode_message(EncodingConfig, Version, Message)

查看源代码
-callback encode_message(EncodingConfig, Version, Message) -> {ok, Bin} | Error
                            when
                                EncodingConfig :: list(),
                                Version :: protocol_version(),
                                Message :: megaco_message(),
                                Bin :: binary(),
                                Error :: term().

编码 megaco 消息。

链接到此回调

encode_transaction(EncodingConfig, Version, Transaction)

查看源代码
-callback encode_transaction(EncodingConfig, Version, Transaction) -> {ok, Bin} | {error, Reason}
                                when
                                    EncodingConfig :: list(),
                                    Version :: protocol_version(),
                                    Transaction :: transaction(),
                                    Bin :: binary(),
                                    Reason :: not_implemented | term().

编码 megaco 事务。 如果由于任何原因不支持此操作,则该函数应返回错误原因 not_implemented

当使用事务发送者和分段时,都会使用此功能。 因此,为了使其中任何一个正常工作,必须完全支持此功能!