日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程

發布時間:2023/12/10 javascript 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
要了解pjsip的使用,simple_pjsua.c是一個很好的例子,雖然代碼只有短短的172行,卻展示了pjsua-lib層的完整使用流程、注冊流程和基本呼叫流程。

下面是學習過程中整理的simple_pjsua.c中的main函數主要流程:

先來看看pjsip-apps/src/samples/simple_pjsua.c的main函數

[cpp] view plaincopy
  • /*?
  • ?*?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));??
  • }??

  • 媒體狀態改變的回調函數: [cpp] view plaincopy
  • //媒體狀態改變的回調函數??
  • /*?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);??
  • ????}??
  • }?
  • 總結

    以上是生活随笔為你收集整理的PJSIP学习笔记——从simple_pjsua.c示例程序了解PJSUA-LIB的基本使用流程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。