asn1c官网:http://lionet.info/asn1c/blog/
asn1c源代码:https://github.com/vlm/asn1c
一. 下载asn1c并编译生成可执行文件(关掉交叉编译)
- 下载asn1c (此版本为主线版本asn1c-0.9.29,非release版本)
git clone https://github.com/vlm/asn1c.git
- 进入下载好的代码asn1c下,执行以下命令编译源代码(可参考INSTALL.md)
test -f configure || autoreconf -iv
sudo ./configure
sudo make
make install
- 执行完以上命令之后,可以使用man asn1c查看命令
二. 使用asn1c命令将.asn文件生成.c和.h文件
-
准备*.asn文件
-
新建目录,将*.asn文件拷贝至./asn下
-
在./下创建out文件夹
v2x@ubuntu:~/ASN/parser$ tree
.
├── asn
│ ├── MsgFrame.asn
│ ├── ***.asn
└── out
MsgFrame.asn如下所示:
MessageFrame ::= CHOICE {
bsmFrame BasicSafetyMessage,
mapFrame MapData,
rsmFrame RoadsideSafetyMessage,
spatFrame SPAT,
rsiFrame RoadSideInformation,
...
}
- 在./执行以下命令,会在out中生成.c和.h文件
默认生成带UPER编解码的版本
asn1c asn/*.asn -D out/ -gen-autotools -no-gen-example
- 如果想要编译带例子的版本(正式代码中不需要,如果想自己测试可以使用)
asn1c asn/*.asn -D out/ -gen-autotools
之后会在./生成configure.ac Makefile.am
生成configuare文件
sudo autoreconf --force --install
sudo autoconf -i
编译例子
mkdir build
sudo ./configure --prefix=$(pwd)/build
sudo make install
会在./build下生成可执行文件和链接库
三.生成libasncodec.so(开启交叉编译)
- 将out/下的*.c 和 *.h 分别拷贝到自己的代码中,编译成libasncodec.so
四.开启asn1c生成的代码中的debug log
- 在编译libasncodec.so时,定义“-DEMIT_ASN_DEBUG=1”,CMakeLists.txt示例如下所示:
源代码中ASN_DEBUG的定义如下所示:
五.encode示例
//asn1c通过MsgFrame.asn自动生成
/* MessageFrame */
typedef struct MessageFrame {
MessageFrame_PR present;
union MessageFrame_u {
BasicSafetyMessage_t bsmFrame;
MapData_t mapFrame;
RoadsideSafetyMessage_t rsmFrame;
SPAT_t spatFrame;
RoadSideInformation_t rsiFrame;
PrivateMsg_t pmFrame;
RTCMcorrections_t rtcmFrame<