chapter 11:sdp offer/answer framework
sdp offer/answer
框架是基於
rfc 3264 「an offer/answer model with the session descriptor protocol (sdp)」
。主要的作用是加速本地和遠端的**協商,並且在一方的邀請會話中協商一組**。
注意儘管這個通常用於邀請會話,這個框架本省是基於通用的
sdp協商框架(pjmedia_sdp_neg),所以這個框架也可以用於其他型別的應用。對話邀請會話提供了
sdp offer/answer
和sip
協議的整合;它能正確地解釋了相關訊息中的訊息體(例如invite、ack、prack、update),並將它們轉換為sdp offer/answer協商。
本章描述了低階別的sdp協商框架,它在標頭檔案中宣告。
11.1 sdp negotiator structure
pjmedia_sdp_neg結構體表示一般的sdp offer/answer會話,用於協商本地和遠端的sdp。
pjmedia_sdp_neg結構體存有三個sdp結構體:
initial_sdp:
初始化本地
endpoint
的能力。這個
sdp是在建立的時候傳遞給協商者的,在整個會話期間內容都不會改變(即使是在協商後)。當收到遠端新的請求(而不是從遠端收到更新的
sdp),協商者使用該
sdp去協商。
active_local_sdp:
和遠端協商後包含本地的
sdp。對話必須使用這個
sdp來啟動本地**而不是初始的
sdp。
active_remote_sdp:
包含遠端的當前
sdp。
協商者有另外兩個
sdp變數,僅用於協商處理期間,叫做neg_local_sdp和neg_remote_sdp。這些都是臨時的sdp描述,應用不能引用這些變數。
11.2 sdp negotiator session
下面的圖表展示了一版的
sdp offer/answer
會話的狀態流轉。
協商會話從pjmedia_sdp_neg_state_null開始。如果對話本地的**描述已經準備好了,並且希望傳送到遠端(通常對話是作為uac的情形下),通過傳遞本地sdp到函式pjmedia_sdp_neg_create_w_local_offer()來建立sdp協商者。該函式將會設定本地endpoint的初始能力,並且設定協商會話的狀態到 pjmedia_sdp_neg_state_local_offer
。之後初始的
dap就可以在傳出的
invite
請求中發到遠端。一旦對話收到遠端的
sdp,就必須呼叫pjmedia_sdp_neg_rx_remote_answer()函式
來提供遠端
sdp。之後協商的函式可以被呼叫。
如果對話已經有遠端**描述了(通常對話是
uas的情形),它可以通過傳遞遠端和本地
sdp到pjmedia_sdp_neg_create_w_remote_offer()來建立
sdp協商者會話。這之後,協商函式可以被呼叫。
會話建立之後,本地和遠端都必須更改會話。協商者可以處理以下兩種情形: #
對話收到遠端的
sdp。這種情形下,對話必須呼叫pjmedia_sdp_neg_rx_remote_offer(),並傳送遠端的
sdp到這個函式。協商函式的返回值取決於本地**是否需要變更。 #
本地想傳送
sdp到遠端。對話選擇下列的行為:
@#如果只是想傳送無變更的當前活躍的
sdp,可以呼叫pjmedia_sdp_neg_tx_local_offer()來獲取本地活躍的
sdp,傳送
sdp,然後等待遠端的應答。 @
想要修改當前活躍的本地**(比如修改流向,活躍的編碼等),必須使用函式pjmedia_sdp_neg_get_local()來獲取當前活躍**,更新,呼叫函式pjmedia_sdp_neg_modify_local_offer()來更新請求,傳送本地
sdp然後等待遠端的響應。
對話可能會想完全的修改本地**(比如修改
ip位址,修改編碼集,增加新的**列表)。這個和上面描述的更改當前**不同,因為將會改變
initial_sdp
,所以之後的協商會基於這個新的
sdp。如果對話想要這麼做,用新的本地
sdp呼叫函式pjmedia_sdp_neg_reinit_local_offer(,傳送
sdp,並等待遠端應答。
對話向遠端傳送
offer
後,必須從遠端收到響應。對話必須向協商者提供遠端
sdp,這樣才可以呼叫協商函式。對話提供遠端的應答通過呼叫pjsip_sdp_neg_rx_remote_answer()。
如果遠端拒絕了本地的
offer
(488
不支援),對話必須呼叫pjsip_sdp_neg_rx_remote_answer()來提供空的遠端
sdp引數,呼叫協商函式,協商者會話才能夠恢復到之前活躍的會話描述,如果有的話。
11.3 sdp negotiation function
對話呼叫函式
pjmedia_sdp_neg_negotiate()
來協商offer
和應答,在提供了協商需要的本地和遠端
sdp後(也就是說協商者狀態為
pjmedia_sdp_neg_state_wait_nego
)。這個函式可以返回以下的結果:
#pj_success( zero),如果成功建立乙個本地和遠端sdp的協商。這種情形下,本地和遠端的活躍sdp將會儲存在會話中作為之後的引用,應用可以查詢這些活躍的sdp來啟動本地**。
#pjmedia_esdpnochange,如果本地和遠端無法達成一致,這種情形下,會話將保持之前的協商過的sdp,這些sdp將不會被修改。如果對話在會話中作為uas,就必須針對這個請求回應488響應。
#pjmedia_esdpnooffer,
如果協商者沒有傳送或收到任何
offer
#pjmedia_esdpnoanswer
,如果協商者沒有收到遠端的應答或者有其他指示錯誤的值。
這些情況下,協商函式可以設定協商狀態為
pjmedia_sdp_neg_state_done.
翻譯 pjsip開發者指南(九)認證框架
chapter 9 authentication framework pjsip提供客戶端和伺服器的認證框架。認證框架支援預設的http摘要認證,但是其他的認證方案也可以加到框架中。下面的圖表描述了框架的類圖。客戶端身份驗證框架管理客戶端到所下游伺服器的身份驗證過程。它能以正確的憑證來響應伺服器的認...
Mark NG 全球開發者大會志願翻譯
2020 11 07 我認領的是演講 ai ml如何加速小分子藥物發現 的英文校驗任務。演講的分享者黃毅汪,是法國亞創生命科學部門team leader,也是演算法工程師。因為涉及機器學習和深度學習領域的術語,在加入的時候大家填過自己的英語水平和專業背景簡介,可能比較合適吧,所以就領到了這個英文校驗...
Oracle 12 1 JDBC開發者指南
12.1用於jdk6,jdk7,低於jdk6的都不被支援 12.1的jdbc驅動也支援oracle11.x,低於11的都不被支援 jdk6以後,不再需要class.forname oracle.jdbc.oracledriver 這句話 標準jdbc驅動中executequery沒有結果集返回時會有...