说明:本文的内容是根据官方的eXosip_User_Manual来翻译,为了省时间提高效率,部分内容是意译,部分内容个人觉得没有必要,所以不翻译。后续的相关文章亦如此。
1.1 如何初始化libeXosip2
使用eXosip时,第一步工作是初始化eXosip和libosip库(解析器和状态机)。在使用libeXosip2前必须必须先做这一步。
#include <eXosip2/eXosip.h>
int i;
i = eXosip_init(); // 初始化eXosip和osip协议栈
if (i != 0)
return -1;
i = eXosip_listen_addr (IPPROTO_UDP, NULL, 5060, AF_INET, 0); // 打开信号socket
if (i != 0) // 传输层初始化失败
{
eXosip_quit();
return -1;
}
然后可以发送消息,等待并处理eXosip事件。
eXosip_event_t *je = NULL;
while (1)
{
je = eXosip_event_wait(0,50); // 侦听是否有消息到来
eXosip_lock();
eXosip_default_action(je);
eXosip_unlock ();
if (je == NULL) // 没有接收到消息
continue;
switch (je->type)
{
case EXOSIP_MESSAGE_NEW:
break;
case EXOSIP_CALL_INVITE:
break;
case EXOSIP_CALL_ACK:
break;
case EXOSIP_CALL_CLOSED:
break;
case ...:
break;
default:
break;
}
eXosip_event_free(je);
}
每当发送一个SIP消息,都会收到一个事件。每个事件包含受影响事务的原始请求,以及触发有效事件的最后应答,
你可以从这些信息获取所有的头部,并存储起来,以方便后续的操作或者显示。
例如:当收到一个呼叫传输REFER请求时,你可以检索“refer-To”头部:
osip_header_t *referto_head = NULL;
i = osip_message_header_get_byname(evt->sip, "refer-To", 0, &referto_head);
if (referto_head == NULL || referto_head->value == NULL)
eXosip_event包含呼叫标识符、注册信息、传入订阅、呼出订阅等。这些标识符将会被API用于控制呼叫、注册、传入或呼出订阅,这些API将会建立默认的带SIP头的信息头(From, To, Call-ID, CSeq, Route, Record-Route,Max-Forward...),并为你发送信息。