@1、exosip初始化

qutecom/wifo/phapi/phapi.c

fun:owplInit()

Line:291

eXosip_set_user_agent(ua);设置SIP包头域User-Agent="qutecom/rev-335d495adbc1-trunk",即SIP客户端名称。

return_code = eXosip_init(0,0,udpPort,tcpPort,tlsPort);
if (return_code != 0){
owplLogError("eXosip_init failed");
return OWPL_RESULT_FAILURE;
}
//...
{
const char * ua=QUTECOM_UA;
eXosip_set_user_agent(ua);
}

@2、创建一个INVITE请求包

拨出电话需要构建一个INVITE发给服务器,服务器转发给另一个UAC。

调用关系:

PhApiWrapper::makeCall()

==>owplCallConnect()

==>phLinePlaceCall_withCa()

==>eXosip_build_initial_invite()

函数声明:

qutecom/wifo/eXosip/include/eXosip/eXosip.h

/**
* Build a default INVITE message for a new call.
*
* @param invite    Pointer for the SIP element to hold.
* @param to        SIP url for callee. * @param from      SIP url for caller.
* @param route     Route header for INVITE. (optionnal)
* @param subject   Subject for the call.
*/
int   eXosip_build_initial_invite(osip_message_t **invite, char *to, char *from, char *route, char *subject);

作用:

构建一个INVITE消息。

实现:

File: qutecom/wifo/eXosip/src/jrequest.c

/* this method can't be called unless the previous   INVITE transaction is over. */
int eXosip_build_initial_invite(osip_message_t **invite, char *to, char *from,char *route, char *subject){
int i;  if (to!=NULL && *to=='/0')
return -1;  osip_clrspace(to);
//清除空格  osip_clrspace(subject);
osip_clrspace(from);
osip_clrspace(route);
if (route!=NULL && *route=='/0')
route=NULL;
if (subject!=NULL && *subject=='/0')
subject=NULL;
//构建INVITE包
i = generating_request_out_of_dialog(invite, "INVITE", to, from, route);
if (i!=0) return -1;
#if 0  if (subject==NULL)
osip_message_set_subject(*invite, "New Call");
else  osip_message_set_subject(*invite, subject);
#else  if (subject!=NULL)
osip_message_set_subject(*invite, subject);
//设置SIP头域的SUBJECT字段 //"Subject: Phone call"
#endif  /* after this delay, we should send a CANCEL */
//设置超时
owsip_message_set_expires(*invite, "120");
/* osip_message_set_organization(*invite, "Jack's Org"); */
return 0;}

函数generating_request_out_of_dialog调用generating_request_out_of_dialog2

generating_request_out_of_dialog2在qutecom/wifo/eXosip/src/jrequest.c实现

部分代码

static intgenerating_request_out_of_dialog2(osip_message_t **dest, char *method_name, char *to, char *from, char *proxy, int seqnum){
//...
i = osip_message_init(&request);
//初始化  if (i!=0) return -1;
/* prepare the request-line */
osip_message_set_method(request, osip_strdup(method_name));
osip_message_set_version(request, osip_strdup("SIP/2.0"));//"INVITE sip:to@192.168.105.14 SIP/2.0"
osip_message_set_status_code(request, 0);
osip_message_set_reason_phrase(request, NULL);//
//...
i = osip_message_set_to(request, to);//"To: <sip:to@192.168.105.14>"
//...
osip_message_set_from(request, from);//
osip_from_set_tag(request->from, osip_from_tag_new_random());//"rom: <sip:from@192.168.105.5>;tag=29244"
//...
osip_call_id_set_number(callid, cidrand);//"Call-ID: 8103"
//...  osip_cseq_set_number(cseq, num);
osip_cseq_set_method(cseq, osip_strdup(method_name));
request->cseq = cseq; //"CSeq: 20 INVITE"
//...
osip_message_set_max_forwards(request, "70");
/* a UA should start a request with 70 */
//Max-Forwards: 70
//...
osip_message_set_via(request, tmp);//"Via: SIP/2.0/UDP 192.168.105.5:5060;rport;branch=z9hG4bK2195"
//...
osip_message_set_contact (request, contact) ;//"Contact: <sip:from@192.168.105.5:5060>"
//...
osip_message_set_user_agent(request, eXosip.user_agent);//"User-Agent: QuteCom2.2.1 (eXosip2/3.3.0)"
//...
//设定完头域后,INVITE消息应该长得像这样:
//INVITE sip:to@192.168.105.14 SIP/2.0
//Via: SIP/2.0/UDP 192.168.105.5:5060;rport;branch=z9hG4bK2195
//From: <sip:from@192.168.105.5>;tag=29244
//To: <sip:to@192.168.105.14>
//Call-ID: 8103
//CSeq: 20 INVITE
//Contact: <sip:from@192.168.105.5:5060>
//Max-Forwards: 70
//User-Agent: Linphone/3.2.1 (eXosip2/3.3.0)
//Subject: Phone call  //subject在eXosip_build_initial_invite中被设置。在本函数调用后随即调用
}

这个函数调用了oSip2库的一系列xxsetxx函数设置INVITE包的各个头域。

头域的定义在《sip中文参考手册》P122 20 头域一节有完整说明

《sip中文参考手册》已经放在资源中。

QuteCom手记:exosip初始化和构建INVITE请求相关推荐

  1. 视频质量诊断-eXosip2 发送invite 请求视频

    视频质量诊断需要视频流,通过发送INVITE请求获取视频,需要在INVITE请求的消息体中包含相应的SDP信息.SDP(Session Description Protocol)是一种协议,用于描述多 ...

  2. Xamarin Essentials教程构建共享请求

    Xamarin Essentials教程构建共享请求 共享请求类ShareTextRequest可以用于构建复杂形式的数据,用于向其他应用传输.例如,它可以指定共享内容的主题Subject,用于给邮件 ...

  3. uploadify 初始化的时候会请求当前页面地址

    2019独角兽企业重金招聘Python工程师标准>>> uploadify 初始化的时候会请求当前页面地址,导致上传时地址被重定向报302错误. 解决方法是: this.settin ...

  4. Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。

    Servlet的生命周期分为5个阶段:加载.创建.初始化.处理客户请求.卸载. (1)加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class) (2)创建:通过调用s ...

  5. QuteCom手记:phapi的声音驱动

    time: 2010-12-14 9:43:18 <-------主题:三个声音驱动-------> /wifo/phapi/phmedia-portaudio.c -- ph_pa_dr ...

  6. gb28181 invite请求信令

    简介: 该系列文章主要介绍,上级域对国标平台进行预览/回看等流程的信令交互. 一个简单的gb28181直播预览流程: 接收下级域的注册请求 发送catalog请求,查看设备信息 选择设备进行预览 in ...

  7. GB28181国标流媒体服务解决方案_2016版本-INVITE请求视频(UDP、TCP active、 TCP passive)

    安防监控视频流媒体平台EasyGBS能够通过简单的网络摄像机通道配置,将传统监控行业里面的高清网络摄像机IP Camera.NVR等GB28181国标协议输出的设备.平台接入到EasyGBS,Easy ...

  8. Python网络爬虫过程中,构建网络请求的时候,参数`stream=True`的使用

    点击上方"Python共享之家",进行关注 回复"资源"即可获赠Python学习资料 今 日 鸡 汤 海内存知己,天涯若比邻. 大家好,我是皮皮. 一.前言 前 ...

  9. GB28181结束Invite请求

    GB28181结束Invite请求 GB28181协议基于Sip,通过Bye消息结束Invite请求,需要注意的时Bye消息中要求不仅仅Call-id 与Invite消息相同,还要求tag信息正确.下 ...

最新文章

  1. U盘挂载,gedit,vi,文本模式中文乱码等等问题
  2. 通关制单机器人_2020关务节|“数字供应链与智能通关”论坛——如何打造云上跨境贸易生态圈...
  3. linux发行版 以及 包管理方式
  4. LeetCode 295. 数据流的中位数 Hard难度
  5. LightGBM——提升机器算法(图解+理论+安装方法+python代码)
  6. 【图像融合】基于matlab CBF算法图像融合【含Matlab源码 083期】
  7. 一元多项式的带余除法
  8. viper4android 2.5正版,VIPER4Android最新版本
  9. modelsim error:iteration limit reached at time xxx ns.
  10. DevOps - (1)Terraform+阿里云实现云资源的CI/CD
  11. html png图片不显示,IE打开网页时部分图片无法显示(PNG图片显示为叉叉)的解决办法...
  12. iperf安装与使用
  13. egg extend ts_KPL五周T队排名,“天王级”战队只有两个,TS被踢出队列
  14. Jdbc小项目:员工工管理系统
  15. oj平台常见输出结果显示
  16. 青蛙设计首席创意执行官:一切都是为了创新
  17. 沃尔玛申请了个物联网专利 能做到“补货”自动下单
  18. 简简单单一行代码实现textarea内容原样输出,与微博展示效果类似
  19. android仿苹果悬浮窗,Android仿IOS悬浮拖动按钮
  20. Pygame游戏之 豌豆射手

热门文章

  1. 迁移学习——理论分析文献
  2. 硬盘 详解硬盘物理结构
  3. Adobe Acrobat Pro DC设置文档多级列表
  4. python文件打包成可执行文件pyinstaller -F ***.pt
  5. Cortex-A8存储器管理
  6. sa登录时的各种错误
  7. 机器学习实战-2.1
  8. css3网站代码 html5_网站布局、排版优秀的HTML5+CSS3网页设计
  9. 关于 sql 取值 统计某个科目 余额表余额问题
  10. FATE联邦学习框架部署实践