软件版本:
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 <eXosip2/eXosip.h>
- #include <osip2/osip_mt.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <sys/types.h>
-
- int
- main (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;
-
-
- 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;
-
- switch (je->type)
- {
- case EXOSIP_MESSAGE_NEW:
- printf (" EXOSIP_MESSAGE_NEW!\n");
- if (MSG_IS_MESSAGE (je->request))
- {
- {
- osip_body_t *body;
- osip_message_get_body (je->request, 0, &body);
- printf ("I get the msg is: %s\n", body->body);
-
- }
-
- 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);
-
- 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");
-
-
-
- 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 ();
-
-
- 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);
-
-
- pos ++;
- }
- break;
- case EXOSIP_CALL_ACK:
- printf ("ACK recieved!\n");
-
- break;
- case EXOSIP_CALL_CLOSED:
- printf ("the remote hold the session!\n");
-
-
- 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_CALL_MESSAGE_NEW,
-
- EXOSIP_MESSAGE_NEW,
-
- 我也不是很明白,理解是: EXOSIP_CALL_MESSAGE_NEW是一个呼叫中的新
- 的消息到来,比如ring trying都算,所以在接受到后必须判断
- 该消息类型,EXOSIP_MESSAGE_NEW而是表示不是呼叫内的消息到来。
- 该解释有不妥地方,仅供参考。
- */
- printf(" EXOSIP_CALL_MESSAGE_NEW\n");
- if (MSG_IS_INFO(je->request))
- {
- 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 <eXosip2/eXosip.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <netinet/in.h>
- #include <sys/socket.h>
- #include <sys/types.h>
-
- 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;
- }
-
-
- 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");
-
-
- 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':
-
- eXosip_call_build_info (dialog_id, &info);
- snprintf (tmp , 4096,
- "hello,rainfish");
- osip_message_set_body (info, tmp, strlen(tmp));
-
- osip_message_set_content_type (info, "text/plain");
- eXosip_call_send_request (dialog_id, info);
- break;
- case 'm':
-
-
- 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));
-
- 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";
- char *registar="sip:133@192.168.3.168: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之类的应答信息。
来源
(bloghome) |