1

我正在使用 asn1c 根据 TCAP 协议规范生成的 c 代码(即相应的ASN1 文件)。我可以通过生成的代码成功地对 TCAP 数据包进行编码。但是,尝试“解码”相关字节流失败。

示例代码如下。

// A real byte stream of a TCAP message:
unsigned char packet_bytes[] = {
  0x62, 0x43, 0x48, 0x04, 0x00, 0x18, 0x02, 0x78,
  0x6b, 0x1a, 0x28, 0x18, 0x06, 0x07, 0x00, 0x11,
  0x86, 0x05, 0x01, 0x01, 0x01, 0xa0, 0x0d, 0x60,
  0x0b, 0xa1, 0x09, 0x06, 0x07, 0x04, 0x00, 0x00,
  0x01, 0x00, 0x14, 0x03, 0x6c, 0x1f, 0xa1, 0x1d,
  0x02, 0x01, 0x00, 0x02, 0x01, 0x2d, 0x30, 0x15,
  0x80, 0x07, 0x91, 0x64, 0x21, 0x92, 0x05, 0x31,
  0x74, 0x81, 0x01, 0x01, 0x82, 0x07, 0x91, 0x64,
  0x21, 0x00, 0x00, 0x90, 0x02
};
// Initializing ...
TCAP_TCMessage_t _pdu, *pdu = &_pdu;
memset(pdu, 0, sizeof(*pdu));    

// Decoding:
asn_dec_rval_t dec_ret = ber_decode(NULL, &asn_DEF_TCAP_TCMessage, (void **) &pdu, packet_bytes, sizeof(packet_bytes));

虽然正确检测到消息类型(在本例中为“Begin”),但未解析其他参数。

使用其他编码规则,即aper_decode()uper_decode(),也会失败。如果有人能描述如何使用自动生成的 c 代码来解码(解析)TCAP 消息的字节串,我将不胜感激。

4

2 回答 2

1

@Vasil,非常感谢您的回答。

你使用的是哪个 asn1c(git commit id),你从哪里得到它,因为那里有相当多的分叉日志?

我使用mouse07410 的分支

您如何知道正确检测到 Begin?

从ber_decode 评估presentpdu变量字段(您可以pdu在示例代码中看到类型)。从这个字节流的“Wireshark”输出中,我知道消息的正确类型是Begin.

您可以尝试在 CFLAGS 中使用 -DASN_EMIT_DEBUG=1 进行编译(或 -DEMIT_ASN_DEBUG=1,具体取决于您使用的 asn1c 版本)以获得更多调试消息。

感谢提供提示;这很有帮助。


问题与我使用的 asn1 文件有关。我使用osmocom asn1 文件并编译它们

ASN=../asn
asn1c $ASN/DialoguePDUs.asn $ASN/tcap.asn $ASN/UnidialoguePDUs.asn

其中,DialoguePortion定义如下(注意第一个定义已注释):

--DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL

-- WS adaptation
DialoguePortion ::= [APPLICATION  11] IMPLICIT DialogueOC
DialogueOC ::= OCTET STRING    

为了能够解码 TCAP 消息,需要使用前一种定义(如标准中的那样),即DialoguePortion应定义为

DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL

在 asn1 文件中使用后一个定义并重新编译 asn1 文件时,问题解决了。

PS:这个问题也和我的问题有关。

于 2019-08-26T08:32:56.597 回答
0

我正在使用由 TCAP 协议规范中的 asn1c 生成的 c 代码

你使用的是哪个 asn1c(git commit id),你从哪里得到它,因为那里有相当多的分叉日志?

虽然正确检测到消息类型(在本例中为“Begin”),但未解析其他参数。

您如何知道正确检测到 Begin?

使用其他编码规则,即 aper_decode() 和 uper_decode(),也会失败。

尝试其他编码是没有意义的,因为它们不是二进制兼容的。

如果有人能描述如何使用自动生成的 c 代码来解码(解析)TCAP 消息的字节串,我将不胜感激。

您正在正确使用它,并且可能在 BER 解码器的某处存在错误。

您可以尝试使用-DASN_EMIT_DEBUG=1in CFLAGS(或-DEMIT_ASN_DEBUG=1根据asn1c您使用的版本)进行编译以获取更多调试消息。

于 2019-08-19T15:20:54.500 回答