本文实现pjsua开源库的交叉编译以及通过调用pjsua库api实现sip语言双向通话功能,包括注册上线sip服务器、接收处理指令(电话邀请、挂断等)、双向音频对讲功能。
二、交叉编译pjsua库
1.解压
tar -zxvf 2.15.1.tar.gz; cd pjproject-2.15.1;
2.配置编译选项
./configure \ --host=arm-linux-gnueabihf \ --prefix=$(pwd)/_mini \ --enable-shared \ --disable-video \ --disable-pjsua2 \ --disable-sound \ --disable-ssl \ --disable-ffmpeg \ --disable-v4l2 \ CFLAGS=“-Os -DNDEBUG” \ LDFLAGS=“-s” \ CC=arm-linux-gnueabihf-gcc \ CXX=arm-linux-gnueabihf-g++ \ AR=arm-linux-gnueabihf-ar \ RANLIB=arm-linux-gnueabihf-ranlib
可用选项:
#禁用高质量的音频处理算法
–disable-libwebrtc
3.编译安装
make dep
make
make install
4.完成动态库移植
动态库路径在 pjproject-2.15.1/_install/lib/
5.工程项目编译可能会报错,比如大小端未定义
makefile加个选项:
CFLAGS+= -DPJ_IS_LITTLE_ENDIAN=1 -DPJ_IS_BIG_ENDIAN=0 (仅供参考)
6.解决编译警告
sip/include/pj/compat/limits.h:38:4: error: #warning "limits.h is not found or not supported. LONG_MIN and LONG_MAX " "will be defined by the library in pj/compats/limits.h and " “overridable in config_site.h” [-Werror=cpp] 38 | # warning "limits.h is not found or not supported. LONG_MIN and LONG_MAX " \ | ^~~~~~~ cc1: all warnings being treated as errors
(1)将/sip/include/pj/config_site.h的文件内容改为:
点击查看代码
(2)将/sip/include/pj/compat/limits.h的
点击查看代码
改为:
点击查看代码
三、简单了解sip协议
SIP(会话初始协议)是一个在互联网上发起、管理和结束多媒体通信(如语音通话、视频会议)的信令控制协议。本文只实现语言通话。
以下是客户端与服务器和主叫方注册,通话等交互的流程:
1.注册与认证(通话准备)
(1)用户设备(UA)向SIP服务器发送 REGISTER 请求,包含用户标识(如 sip:user@example.com)。
(2)若需认证,服务器返回 401 Unauthorized,要求提供凭证(如用户名、密码)。
(3)终端重新发送带认证信息的 REGISTER,服务器验证通过后回复 200 OK,完成注册。
(4)作用:告知服务器终端可达地址,为后续呼叫路由提供依据。
2.呼叫建立(信令交互)
(1)主叫发起邀请
a.主叫发送 INVITE 请求,包含被叫URI(如 sip:bob@domain.com)和媒体描述(SDP协议)。
b.SDP信息包括:
媒体类型(音频/视频)
编解码格式(如G.711、Opus)
接收音频rtp数据包的IP地址及端口号
(2)被叫响应
a.被叫收到 INVITE 后返回 100 Trying(处理中)。
b.若可接听,返回 180 Ringing(振铃),主叫听到回铃音。
c.被叫摘机后发送 200 OK,携带自身SDP参数(如接收IP和端口)。
d.主叫回复 ACK 确认,呼叫正式建立
3.会话修改与终止
(1)会话修改(可选)
主叫通话中调整参数(如切换高清音频)时,发送 UPDATE或 RE-INVITE请求,重新协商SDP
(2)终止通话
任一方发送 BYE请求
对方回复 200 OK,释放媒体资源及网络承载
4.通话阶段(媒体传输)
双向RTP语音流(主叫 ↔ 被叫)
(1)协议:RTP(Real-time Transport Protocol)
(2)传输内容:
a.音频数据包(按协商的编解码格式)
b.语音连续性信息
c.时间戳(确保音频同步)
四、代码实现
点击查看代码
五、TCP/UDP抓包数据分析
1.stun查询外网ip
stun查询外网ip
2.stun返回设备的公网ip
stun返回设备的公网ip
3.设备NAT打洞成功
设备NAT打洞成功
4.开始注册
开始注册
5.服务器应答注册
服务器应答注册