Parsing 如何使用asn1c生成的代码解码GSM-TCAP消息
我使用的是asn1c根据TCAP协议规范生成的c代码(即相应的代码)。 我可以通过生成的代码成功地对TCAP数据包进行编码。 但是,尝试“解码”相关字节流失败 示例代码如下所示Parsing 如何使用asn1c生成的代码解码GSM-TCAP消息,parsing,gsm,asn.1,ss7,Parsing,Gsm,Asn.1,Ss7,我使用的是asn1c根据TCAP协议规范生成的c代码(即相应的代码)。 我可以通过生成的代码成功地对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,
// 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));
消息类型(在本例中为“开始”)被正确检测,但其他参数未被解析
使用其他编码规则,即aper_decode()
和uper_decode()
,也会失败。
如果有人能描述如何使用自动生成的c代码对TCAP消息的字节字符串进行解码(解析),我将不胜感激
我使用的是asn1c根据TCAP协议规范生成的c代码
您使用的是哪个asn1c(git commit id)以及它是从哪里获得的,因为有相当多的forks日志
消息类型(在本例中为“开始”)被正确检测,但其他参数未被解析
您如何知道Begin被正确检测到
使用其他编码规则,即aper_decode()和uper_decode(),也会失败
尝试其他编码没有意义,因为它们不兼容二进制
如果有人能描述如何使用自动生成的c代码对TCAP消息的字节字符串进行解码(解析),我将不胜感激
您正在正确地使用它,并且可能在BER解码器中的某个地方存在错误
您可以尝试在
CFLAGS
中使用-DASN\u EMIT\u DEBUG=1
进行编译(或-DEMIT\u ASN\u DEBUG=1
根据您使用的asn1c
版本而定),以获取更多的调试消息。@Vasil,非常感谢您的回答
您正在使用哪个asn1c(git提交id)以及从哪里获得它
因为那里有很多叉子
我用这个
您如何知道Begin被正确检测到
从ber_decode评估的pdu
变量的present
字段(您可以在示例代码中看到pdu
类型)。
从这个字节流的“Wireshark”输出中,我知道正确的消息类型是Begin
您可以尝试使用CFLAGS中的-DASN_EMIT_DEBUG=1进行编译(或
-DEMIT_ASN_DEBUG=1(取决于您使用的asn1c版本),以获取更多调试消息
谢谢你的提示;这很有帮助
问题与我使用的asn1文件有关。 我使用并编译了它们
ASN=../asn
asn1c $ASN/DialoguePDUs.asn $ASN/tcap.asn $ASN/UnidialoguePDUs.asn
其中,dialoguepartion
定义如下(注意,第一个定义被注释):
为了能够解码TCAP消息,
需要使用前面的定义(如中所示),即,dialoguepartion
应定义为
DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL
在asn1文件中使用后一种定义时,
重新编译asn1文件,问题解决了
附言:这也和我的问题有关 非常感谢你的回答。我终于解决了问题,并添加了我的解决方案。感谢您描述修复。请同时向osmocom报告。@Vasil,我们如何向osmocom报告?向openbsc邮件列表发送一条消息,或在他们的bug追踪器中打开一个新问题(不太确定在哪个项目中)。
DialoguePortion ::= [APPLICATION 11] EXPLICIT EXTERNAL