查看源代码 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 消息的最小解码。
编码 megaco 操作回复。 如果由于任何原因不支持此操作,则该函数应返回错误原因 not_implemented
。
编码 megaco 操作请求。 当用户调用函数 encode_actions/3 时,会调用此函数。 如果从未使用该函数,或者编解码器不支持此功能(单个操作的编码),则返回错误原因 not_implemented
。
编码 megaco 消息。
编码 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 mtpAddress() :: octet_string().
在 Erlang 类型系统中无法正确表示此类型,因此这是我们能做的最好方式。
正确的定义将是: -type mtpAddress() :: octet_string(2..4).
-type octet() :: 0..255.
-type octet_string() :: [octet()].
在 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 transaction() :: {transactionRequest, transaction_request()} | {transactionPending, transaction_reply()} | {transactionReply, transaction_pending()} | {transactionResponseAck, transaction_response_ack()} | {segmentReply, segment_reply()}.
-type transaction_pending() :: #'TransactionPending'{transactionId :: term()}.
-type transaction_reply() :: {'TransactionReply', _, _} | {'TransactionReply', _, _, _, _}.
TransactionReply 的问题在于其定义取决于我们正在使用的协议版本。 从版本 3 开始,它有两个额外的字段。
-type transaction_response_ack() :: [transaction_ack()].
回调
-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 参数是整数,则表示这是消息的预期版本,并且应使用该版本的解码器。
-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 模块会使用此函数。
再次注意,成功的解码仅返回部分初始化的消息。
-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
。
当配置了分段时,将使用此函数。 因此,为了使此功能正常工作,必须完全支持此函数!
-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
。
-callback encode_message(EncodingConfig, Version, Message) -> {ok, Bin} | Error when EncodingConfig :: list(), Version :: protocol_version(), Message :: megaco_message(), Bin :: binary(), Error :: term().
编码 megaco 消息。
-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
。
当使用事务发送者和分段时,都会使用此功能。 因此,为了使其中任何一个正常工作,必须完全支持此功能!