移植libeXosip2和libosip2到arm开发板

本文介绍如何使用交叉编译器编译libosip2及libeXosip2库,并在ARM开发板上完成SIP注册流程。文中详细记录了编译步骤、所需脚本及其内容,同时解决了一些常见问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Linux linux

本篇主要是为了补充之前写的《编译libeXosip以及向代理服务器注册》
http://blog.youkuaiyun.com/dreamintheworld/article/details/72939454

下载解压
libosip2-4.1.0.tar.gz
libeXosip2-4.1.0.tar.gz

编译 libosip2-4.1.0(使用arm-none-linux-gnueabi-gcc交叉编译器)

$ ./configure --prefix=$PWD/_install --host=arm-none-linux-gnueabi  
$ make
$ make install

编译 libeXosip2-4.1.0(添加一个空文件config.h否则编译会报错找不到该文件)

$ sh myconfigure.sh
$ touch config.h
$ make
$ make install

编译注册demo(libeXosip2-4.1.0/tools/sip_reg.c)

~/project/demo/osip_arm_demo/libeXosip2-4.1.0/tools$ sh build_reg.sh

开发板中运行可执行程序(需要添加动态库搜索路径)

/mnt/libosip2-4.1.0/_install/lib # export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
/mnt/libeXosip2-4.1.0/_install/lib # export LD_LIBRARY_PATH=`pwd`:$LD_LIBRARY_PATH
/mnt/libeXosip2-4.1.0/tools # sh reg.sh

抓包后可以看到例程已经发起注册并且服务器回复200 OK表示注册成功。

到此为止,应用程序已经测 试完成了

其中使用到了三个脚本 myconfigure.sh, build_reg.sh, reg.sh 分别如下 :

myconfigure.sh (编译libeXosip2-4.1.0时需要配置libosip2的路径以及部分编译选项参数)

echo "BUILD libeXosip2-4.1.0"
./configure --prefix=$PWD/_install \
CC=arm-none-linux-gnueabi-gcc \
--host=arm-none-linux-gnueabi \
--disable-tools \
--disable-debug \
--disable-trace \
--disable-shared \
--enable-openssl \
--enable-static \
CFLAGS='-I/home/admin/project/demo/osip_arm_demo/libosip2-4.1.0/_install/lib/include' \
LDFLAGS='-L/home/admin/project/demo/osip_arm_demo/libosip2-4.1.0/_install/lib' \
LIBS='-losipparser2 -losip2' \
SIP_CFLAGS='-I/home/admin/project/demo/osip_arm_demo/libosip2-4.1.0/_install/lib/include' \
OSIP_LIBS='-L/home/admin/project/demo/osip_arm_demo/libosip2-4.1.0/_install/lib -losipparser2 -losip2'

build_reg.sh(需要指定libosip2库和libeXosip2库的路径)

arm-none-linux-gnueabi-gcc -g -O2 -I/home/admin/project/demo/osip_arm_demo/libosip2-4.1.0/_install/include \
-L/home/admin/project/demo/osip_arm_demo/libosip2-4.1.0/_install/lib \
-I/home/admin/project/demo/osip_arm_demo/libeXosip2-4.1.0/_install/include \
-L/home/admin/project/demo/osip_arm_demo/libeXosip2-4.1.0/_install/lib \
sip_reg.c \
-o sipreg \
-leXosip2 -losip2 -losipparser2 -lpthread -lresolv

reg.sh (192.168.1.2为服务器IP地址)

./sipreg \
-r sip:192.168.1.2:5060 \
-u sip:01c001b01u0102@192.168.1.2 \
-c sip:01c001b01u0102@192.168.1.2:5060 \
-U 01c001b01u0102 \
-P 01c001b01u0102  \
-p 5061 \
-e 1800 \
-d

运行程序的时候出现了一个问题
DEBUG: [get_output_if] connect: Network is unreachable

这是由于在开源库的程序中直接使用了默认的方式获取IP地址,但是在我的开发板中需要指定网卡获取到IP地址
所以需要按如下方式修改库的程序(修改libeXosip2-4.1.0/src/eXutils.c)
函数 _eXosip_default_gateway_ipv4 (struct eXosip_t *excontext, char *address, int size)


这里写图片描述

static int
_eXosip_default_gateway_ipv4 (struct eXosip_t *excontext, char *address, int size)
{
  socklen_t len;
  int sock_rt, on = 1;

  struct sockaddr_in iface_out;

  struct sockaddr_in remote;

  memset (&remote, 0, sizeof (struct sockaddr_in));

  remote.sin_family = AF_INET;
  {
        printf("%s(%d)\n", __FILE__, __LINE__);
        int sockfd;   
        struct sockaddr_in sin;   
        struct ifreq ifr;         
        sockfd = socket(AF_INET, SOCK_DGRAM, 0);      
        if (sockfd == -1)   {             
            return -1;            
        }         
        strncpy(ifr.ifr_name, "eth0", IFNAMSIZ);    // 指定网卡  
        ifr.ifr_name[IFNAMSIZ - 1] = 0;       
        if (ioctl(sockfd, SIOCGIFADDR, &ifr) < 0)    {             
            return -1;    
        }     
        memcpy(&sin, &ifr.ifr_addr, sizeof(sin));     
        remote.sin_addr.s_addr = sin.sin_addr.s_addr;
        printf("%s(%d)%s\n", __FILE__, __LINE__, inet_ntoa(sin.sin_addr));
  }
  //remote.sin_addr.s_addr = inet_addr (excontext->ipv4_for_gateway);
  remote.sin_port = htons (11111);

开发环境是ubuntu64位的电脑和ubuntu32位的arm开发板

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值