科技知识动态:osip2/eXosip2调试笔记

导读 跟大家讲解下有关osip2 eXosip2调试笔记,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说osip2 eXosip2调试笔记,小编也收集

跟大家讲解下有关osip2/eXosip2调试笔记,相信小伙伴们对这个话题应该也很关注吧,现在就为小伙伴们说说osip2/eXosip2调试笔记,小编也收集到了有关osip2/eXosip2调试笔记的相关资料,希望大家看到了会喜欢。

软件版本: libosip2-3.3.0.tar.gz libeXosip2-3.3.0.tar.gz ./configure --prefix=/opt/sip/target --disable-static make make install 测试代码: 代码来源:http://blog.csdn.net/bat603/archive/2006/11/15/1386277.aspx 1、UAS //*******************U

软件版本:

libosip2-3.3.0.tar.gz

libeXosip2-3.3.0.tar.gz

./configure --prefix=/opt/sip/target --disable-static

make

make install

测试代码:

代码来源:http://blog.csdn.net/bat603/archive/2006/11/15/1386277.aspx

1、UAS

//*******************UAS**************************************************//#include #include #include #include #include #include #include intmain (int argc, char *argv[]){ eXosip_event_t *je = NULL; osip_message_t *ack = NULL; osip_message_t *invite = NULL; osip_message_t *answer = NULL; sdp_message_t *remote_sdp = NULL; int call_id, dialog_id; int i,j; int id; char *sour_call ="sip:133@192.168.0.133"; char *dest_call ="sip:140@192.168.0.140:5060"; char command; char tmp[4096]; char localip[128]; int pos = 0; //初始化sip i = eXosip_init (); if (i != 0) { printf ("Can't initialize eXosip!/n"); return -1; } else { printf ("eXosip_init successfully!/n"); } i = eXosip_listen_addr (IPPROTO_UDP, NULL, 5060, AF_INET, 0); if (i != 0) { eXosip_quit (); fprintf (stderr,"eXosip_listen_addr error!/nCouldn't initialize transport layer!/n"); } for(;;) { //侦听是否有消息到来 je = eXosip_event_wait (0,50); //协议栈带有此语句,具体作用未知 eXosip_lock (); eXosip_default_action (je); eXosip_automatic_refresh (); eXosip_unlock (); if (je == NULL)//没有接收到消息 continue; // printf ("the cid is %s, did is %s/n", je->did, je->cid); switch (je->type) { case EXOSIP_MESSAGE_NEW://新的消息到来 printf ("EXOSIP_MESSAGE_NEW!/n"); if (MSG_IS_MESSAGE (je->request))//如果接受到的消息类型是MESSAGE { { osip_body_t *body; osip_message_get_body (je->request, 0, &body); printf ("I get the msg is: %s/n", body->body); //printf ("the cid is %s, did is %s/n", je->did, je->cid); } //按照规则,需要回复200 OK信息 eXosip_message_build_answer (je->tid, 200,&answer); eXosip_message_send_answer (je->tid, 200,answer); } break; case EXOSIP_CALL_INVITE: //得到接收到消息的具体信息 printf ("Received a INVITE msg from %s:%s, UserName is %s, password is %s/n",je->request->req_uri->host, je->request->req_uri->port, je->request->req_uri->username, je->request->req_uri->password); //得到消息体,认为该消息就是SDP格式. remote_sdp = eXosip_get_remote_sdp (je->did); call_id = je->cid; dialog_id = je->did; eXosip_lock (); eXosip_call_send_answer (je->tid, 180, NULL); i = eXosip_call_build_answer (je->tid, 200, &answer); if (i != 0) { printf ("This request msg is invalid!Cann't response!/n"); eXosip_call_send_answer (je->tid, 400, NULL); } else { snprintf (tmp, 4096,"v=0/r/n""o=anonymous 0 0 IN IP4 0.0.0.0/r/n""t=1 10/r/n""a=username:rainfish/r/n""a=password:123/r/n"); //设置回复的SDP消息体,下一步计划分析消息体 //没有分析消息体,直接回复原来的消息,这一块做的不好。 osip_message_set_body (answer, tmp, strlen(tmp)); osip_message_set_content_type (answer,"application/sdp"); eXosip_call_send_answer (je->tid, 200, answer); printf ("send 200 over!/n"); } eXosip_unlock (); //显示出在sdp消息体中的 attribute 的内容,里面计划存放我们的信息 printf ("the INFO is :/n"); while (!osip_list_eol (remote_sdp->a_attributes, pos)) { sdp_attribute_t *at; at = (sdp_attribute_t *) osip_list_get (remote_sdp->a_attributes, pos); printf ("%s : %s/n", at->a_att_field, at->a_att_value);//这里解释了为什么在SDP消息体中属性a里面存放必须是两列 pos ++; } break; case EXOSIP_CALL_ACK: printf ("ACK recieved!/n"); // printf ("the cid is %s, did is %s/n", je->did, je->cid); break; case EXOSIP_CALL_CLOSED: printf ("the remote hold the session!/n"); // eXosip_call_build_ack(dialog_id, &ack); //eXosip_call_send_ack(dialog_id, ack); i = eXosip_call_build_answer (je->tid, 200, &answer); if (i != 0) { printf ("This request msg is invalid!Cann't response!/n"); eXosip_call_send_answer (je->tid, 400, NULL); } else { eXosip_call_send_answer (je->tid, 200, answer); printf ("bye send 200 over!/n"); } break; case EXOSIP_CALL_MESSAGE_NEW://至于该类型和EXOSIP_MESSAGE_NEW的区别,源代码这么解释的 /* EXOSIP_CALL_MESSAGE_NEW, /**< announce new incoming request. */ EXOSIP_MESSAGE_NEW, /**request))//如果传输的是INFO方法 { eXosip_lock (); i = eXosip_call_build_answer (je->tid, 200, &answer); if (i == 0) { eXosip_call_send_answer (je->tid, 200, answer); } eXosip_unlock (); { osip_body_t *body; osip_message_get_body (je->request, 0, &body); printf ("the body is %s/n", body->body); } } break; default: printf ("Could not parse the msg!/n"); } }}

>> gcc uastest.c -o uastest -L/opt/sip/target/lib/ -I/opt/sip/target/include/ -leXosip2

问题及其解决:

编译问题:

uastest.c: In function `main':uastest.c:118: incompatible type for argument 1 of `osip_list_eol'uastest.c:122: incompatible type for argument 1 of `osip_list_get'

解决方法:

The osip_list_* interface has been changed in latest versions of

osip and osip_list_t in structures are not pointer any more.I think Updating is just a matter of adding"&"in front of remote_sdp->m_medias and to other list accessed.

运行问题:

[root@localhost linphonenew]# ./uastest./uastest: error while loading shared libraries: libosipparser2.so.4: cannot open shared object file: No such file or directory

解决方法:

#libosipparser2相关库文件复制到usr、lib目录下面

cp /opt/sip/target/lib/libosipp* /usr/lib

2、uac

#include #include #include #include #include #include int main (int argc, char *argv[]){ eXosip_event_t *je; osip_message_t *reg = NULL; osip_message_t *invite = NULL; osip_message_t *ack = NULL; osip_message_t *info = NULL; osip_message_t *message = NULL; int call_id, dialog_id; int i,flag; int flag1 = 1; int id; char *identity ="sip:140@192.168.0.140"; char *registerer ="sip:192.168.0.133:5060"; char *source_call ="sip:140@192.168.0.140"; char *dest_call ="sip:133@192.168.0.133:5060"; char command; char tmp[4096]; char localip[128]; printf("r 向服务器注册/n/n"); printf("c 取消注册/n/n"); printf("i 发起呼叫请求/n/n"); printf("h 挂断/n/n"); printf("q 退出程序/n/n"); printf("s 执行方法INFO/n/n"); printf("m 执行方法MESSAGE/n/n"); //初始化 i = eXosip_init (); if (i != 0) { printf ("Couldn't initialize eXosip!/n"); return -1; } else { printf ("eXosip_init successfully!/n"); } i = eXosip_listen_addr (IPPROTO_UDP, NULL, 5060, AF_INET, 0); if (i != 0) { eXosip_quit (); fprintf (stderr,"Couldn't initialize transport layer!/n"); return -1; } flag = 1; while (flag) { printf ("please input the comand:/n"); scanf ("%c", &command); getchar (); switch (command) { case 'r': printf ("This modal isn't commpleted!/n"); break; case 'i': i = eXosip_call_build_initial_invite (&invite, dest_call, source_call, NULL,"This si a call for a conversation"); if (i != 0) { printf ("Intial INVITE failed!/n"); break; } //符合SDP格式,其中属性a是自定义格式,也就是说可以存放自己的信息,但是只能是两列,比如帐户信息 //但是经测试,格式:v o t必不可少,原因未知,估计是协议栈在传输时需要检查的 snprintf (tmp, 4096,"v=0/r/n""o=anonymous 0 0 IN IP4 0.0.0.0/r/n""t=1 10/r/n""a=username:rainfish/r/n""a=password:123/r/n"); osip_message_set_body (invite, tmp, strlen(tmp)); osip_message_set_content_type (invite,"application/sdp"); eXosip_lock (); i = eXosip_call_send_initial_invite (invite); eXosip_unlock (); flag1 = 1; while (flag1) { je = eXosip_event_wait (0, 200); if (je == NULL) { printf ("No response or the time is over!/n"); break; } switch (je->type) { case EXOSIP_CALL_INVITE: printf ("a new invite reveived!/n"); break; case EXOSIP_CALL_PROCEEDING: printf ("proceeding!/n"); break; case EXOSIP_CALL_RINGING: printf ("ringing!/n"); // call_id = je->cid; // dialog_id = je->did; printf ("call_id is %d, dialog_id is %d /n", je->cid, je->did); break; case EXOSIP_CALL_ANSWERED: printf ("ok! connected!/n"); call_id = je->cid; dialog_id = je->did; printf ("call_id is %d, dialog_id is %d /n", je->cid, je->did); eXosip_call_build_ack (je->did, &ack); eXosip_call_send_ack (je->did, ack); flag1 = 0; break; case EXOSIP_CALL_CLOSED: printf ("the other sid closed!/n"); break; case EXOSIP_CALL_ACK: printf ("ACK received!/n"); break; default: printf ("other response!/n"); break; } eXosip_event_free (je); } break; case 'h': printf ("Holded !/n"); eXosip_lock (); eXosip_call_terminate (call_id, dialog_id); eXosip_unlock (); break; case 'c': printf ("This modal isn't commpleted!/n"); break; case 's': //传输INFO方法 eXosip_call_build_info (dialog_id, &info); snprintf (tmp , 4096,"hello,rainfish"); osip_message_set_body (info, tmp, strlen(tmp)); //格式可以任意设定,text/plain代表文本信息 osip_message_set_content_type (info,"text/plain"); eXosip_call_send_request (dialog_id, info); break; case 'm': //传输MESSAGE方法,也就是即时消息,和INFO方法相比,我认为主要区别,是MESSAGE不用建立连接,直接传输信息,而INFO必须 //在建立INVITE的基础上传输。 printf ("the mothed :MESSAGE/n"); eXosip_message_build_request (&message,"MESSAGE", dest_call, source_call, NULL); snprintf (tmp, 4096,"hellor rainfish"); osip_message_set_body (message, tmp, strlen(tmp)); //假设格式是xml osip_message_set_content_type (message,"text/xml"); eXosip_message_send_request (message); break; case 'q': eXosip_quit (); printf ("Exit the setup!/n"); flag = 0; break; } } return (0);}

>> gcc uastest.c -o uastest -L/opt/sip/target/lib/ -I/opt/sip/target/include/ -leXosip2

3/ 单机测试指导

本机ip:192.168.3.168

uac修改:

line23-26改为:

char *identity="sip:140@192.168.3.168"; //UAC1,端口是5060 char *registar="sip:133@192.168.3.168:5061"; //UAS,端口是5061 char *source_call="sip:140@192.168.3.168"; char *dest_call="sip:133@192.168.3.168:5061";

uas修改:

line44改为: i = eXosip_listen_addr (IPPROTO_UDP, NULL, 5061, AF_INET, 0);

其他:

http://hi.baidu.com/yangkaiii/blog/item/e2946f44ecdeaa86b3b7dc5d.html

http://hi.baidu.com/yangkaiii/blog/item/e46a59dde1ad5e305882dd5c.html

4/ 呼叫彩E

本机ip:192.168.3.168

彩E:192.168.3.167

line80到85改为:

snprintf (tmp, 4096,"v=0/r/n""o=- 6 2 IN IP4 192.168.3.46/r/n""s=CounterPath X-Lite 3.0/r/n""c=IN IP4 192.168.3.46/r/n""t=0 0/r/n""m=audio 52386 RTP/AVP 107 0 8 101/r/n""a=alt:1 1 : 0+Y3WBhV SIknnQeS 192.168.3.46 52386/r/n""a=fmtp:101 0-15/r/n""a=rtpmap:107 BV32/16000/r/n""a=rtpmap:101 telephone-event/8000/r/n""a=sendrecv/r/n");

line26:

char *dest_call="sip:111@192.168.3.167:5060";

注意:111的用户名不能就是该彩E的账号,不能随便换成其他的121之类,否则得到busy之类的应答信息。

来源:php中文网

免责声明:本文由用户上传,如有侵权请联系删除!