當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程
生活随笔
收集整理的這篇文章主要介紹了
PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要了解pjsip的使用,simple_pjsua.c是一個很好的例子,雖然代碼只有短短的172行,卻展示了pjsua-lib層的完整使用流程、注冊流程和基本呼叫流程。
/*? ?*?main()? ?*? ?*?argv[1]?may?contain?URL?to?call.? ?*/?? int?main(int?argc,?char?*argv[])?? {?? ????pjsua_acc_id?acc_id;?? ????pj_status_t?status;?? ?? //??創建PJSIP?? ????/*?Create?pjsua?first!?*/?? ????status?=?pjsua_create();?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Error?in?pjsua_create()",?status);?? ?? //??校驗被叫SIP地址是否正確?? ????/*?If?argument?is?specified,?it's?got?to?be?a?valid?SIP?URL?*/?? ????if?(argc?>?1)?{?? ????status?=?pjsua_verify_url(argv[1]);?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Invalid?URL?in?argv",?status);?? ????}?? ?? //????初始化PJSUA,設置回調函數?? ????/*?Init?pjsua?*/?? ????{?? ????pjsua_config?cfg;?? ????pjsua_logging_config?log_cfg;?? ?? ????pjsua_config_default(&cfg);?? ????cfg.cb.on_incoming_call?=?&on_incoming_call;?? ????cfg.cb.on_call_media_state?=?&on_call_media_state;?? ????cfg.cb.on_call_state?=?&on_call_state;?? ?? ????pjsua_logging_config_default(&log_cfg);?? ????log_cfg.console_level?=?4;?? ?? ????status?=?pjsua_init(&cfg,?&log_cfg,?NULL);?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Error?in?pjsua_init()",?status);?? ????}?? ?? //????創建PJSIP的傳輸端口?? ????/*?Add?UDP?transport.?*/?? ????{?? ????pjsua_transport_config?cfg;?? ?? ????pjsua_transport_config_default(&cfg);?? ????cfg.port?=?5060;?? ????status?=?pjsua_transport_create(PJSIP_TRANSPORT_UDP,?&cfg,?NULL);?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Error?creating?transport",?status);?? ????}?? ?? //????啟動PJSIP?? ????/*?Initialization?is?done,?now?start?pjsua?*/?? ????status?=?pjsua_start();?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Error?starting?pjsua",?status);?? ?? //????設置SIP用戶帳號?? ????/*?Register?to?SIP?server?by?creating?SIP?account.?*/?? ????{?? ????pjsua_acc_config?cfg;?? ?? ????pjsua_acc_config_default(&cfg);?? ????cfg.id?=?pj_str("sip:"?SIP_USER?"@"?SIP_DOMAIN);?? ????cfg.reg_uri?=?pj_str("sip:"?SIP_DOMAIN);?? ????cfg.cred_count?=?1;?? ????cfg.cred_info[0].realm?=?pj_str(SIP_DOMAIN);?? ????cfg.cred_info[0].scheme?=?pj_str("digest");?? ????cfg.cred_info[0].username?=?pj_str(SIP_USER);?? ????cfg.cred_info[0].data_type?=?PJSIP_CRED_DATA_PLAIN_PASSWD;?? ????cfg.cred_info[0].data?=?pj_str(SIP_PASSWD);?? ?? ????status?=?pjsua_acc_add(&cfg,?PJ_TRUE,?&acc_id);?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Error?adding?account",?status);?? ????}?? ?? //????發起一個呼叫?? ????/*?If?URL?is?specified,?make?call?to?the?URL.?*/?? ????if?(argc?>?1)?{?? ????pj_str_t?uri?=?pj_str(argv[1]);?? ????status?=?pjsua_call_make_call(acc_id,?&uri,?0,?NULL,?NULL,?NULL);?? ????if?(status?!=?PJ_SUCCESS)?error_exit("Error?making?call",?status);?? ????}?? ?? //????循環等待?? ????/*?Wait?until?user?press?"q"?to?quit.?*/?? ????for?(;;)?{?? ????char?option[10];?? ?? ????puts("Press?'h'?to?hangup?all?calls,?'q'?to?quit");?? ????if?(fgets(option,?sizeof(option),?stdin)?==?NULL)?{?? ????????puts("EOF?while?reading?stdin,?will?quit?now..");?? ????????break;?? ????}?? ?? ????if?(option[0]?==?'q')?? ????????break;?? ?? ????if?(option[0]?==?'h')?? ????????pjsua_call_hangup_all();?? ????}?? ?? ????/*?Destroy?pjsua?*/?? ????pjsua_destroy();?? ?? ????return?0;?? }??
來電的回調函數 [cpp] view plaincopy//來電回調函數?? /*?Callback?called?by?the?library?upon?receiving?incoming?call?*/?? static?void?on_incoming_call(pjsua_acc_id?acc_id,?pjsua_call_id?call_id,?? ?????????????????pjsip_rx_data?*rdata)?? {?? ????pjsua_call_info?ci;?? ?? ????PJ_UNUSED_ARG(acc_id);?? ????PJ_UNUSED_ARG(rdata);?? ?? //????獲得呼叫信息?? ????pjsua_call_get_info(call_id,?&ci);?? ?? ????PJ_LOG(3,(THIS_FILE,?"Incoming?call?from?%.*s!!",?? ?????????????(int)ci.remote_info.slen,?? ?????????????ci.remote_info.ptr));?? ?? //????自動應答呼叫?? ????/*?Automatically?answer?incoming?calls?with?200/OK?*/?? ????pjsua_call_answer(call_id,?200,?NULL,?NULL);?? }??
呼叫狀態改變的回調函數,沒有做實質性的操作: [cpp] view plaincopy//呼叫狀態改變的回調函數?? /*?Callback?called?by?the?library?when?call's?state?has?changed?*/?? static?void?on_call_state(pjsua_call_id?call_id,?pjsip_event?*e)?? {?? ????pjsua_call_info?ci;?? ?? ????PJ_UNUSED_ARG(e);?? ?? ????pjsua_call_get_info(call_id,?&ci);?? ????PJ_LOG(3,(THIS_FILE,?"Call?%d?state=%.*s",?call_id,?? ?????????????(int)ci.state_text.slen,?? ?????????????ci.state_text.ptr));?? }??
//媒體狀態改變的回調函數?? /*?Callback?called?by?the?library?when?call's?media?state?has?changed?*/?? static?void?on_call_media_state(pjsua_call_id?call_id)?? {?? ????pjsua_call_info?ci;?? ?? ????pjsua_call_get_info(call_id,?&ci);?? ?? //????當媒體為激活時,連接呼叫和聲音設備?? ????if?(ci.media_status?==?PJSUA_CALL_MEDIA_ACTIVE)?{?? ????//?When?media?is?active,?connect?call?to?sound?device.?? ????pjsua_conf_connect(ci.conf_slot,?0);?? ????pjsua_conf_connect(0,?ci.conf_slot);?? ????}?? }?
下面是學習過程中整理的simple_pjsua.c中的main函數主要流程:
先來看看pjsip-apps/src/samples/simple_pjsua.c的main函數
[cpp] view plaincopy來電的回調函數 [cpp] view plaincopy
呼叫狀態改變的回調函數,沒有做實質性的操作: [cpp] view plaincopy
總結
以上是生活随笔為你收集整理的PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 亚马逊、微软招揽特斯拉员工:不喜欢马斯克
- 下一篇: i9-12950HX配210W极限散热!