2:pjsip教程(二)之ICE穿越打洞:Interactive Connectivity Establishment簡介
3:pjsip教程(三)之ICE stream transport的使用
本文原文地址:http://www.pjsip.org/pjnath/docs/html/group__PJNATH__ICE__STREAM__TRANSPORT.htm#ga6fb7cfdde71523f9fce885fd5cad982d
學習使用 ICE stream transport
下面的步驟描述了怎樣使用ICE session:
- 首先初始化結構體: pj_ice_strans_cfg. 這個結構體中包含了ICE stream transport 的配置信息,其中就包括了SUTN以及TURN的配置信息.
- 使用 pj_ice_strans_create()方法創建stream transport的實例. 該函數的成功調用還需要以下列出的重要的參數:
- pj_ice_strans_cfg :主配置信息
- components 的個數
- 用於產生回調的結構體的實例:pj_ice_strans_cb .
- 當調用函數pj_ice_strans_create()后,初始化的過程會在后台運行,該初始化過程主要是收集本地的候選地址,最后,當初始化完成,應用程序會在回調函數on_ice_complete 中返回
- 當想要開啟一個媒體流時(例如,想進行視頻或語音電話),使用pj_ice_strans_init_ice()創建一個ICE session用於進行打洞.
- 通常在兩個客戶端開始打洞之前,雙方都需要知道對方的ICE信息(ICE信息,包括用戶名,密碼以及3組候選地址),那么可以使用下面的方法得到自己的ICE信息:
- pj_ice_strans_get_ufrag_pwd()
- pj_ice_strans_enum_cands()
- pj_ice_strans_get_def_cand()
應用程序需要將以上信息封裝為SDP消息發送至對方. - 當應用程序收到遠程客戶端發來的ICE消息后,就可以開始ICE探測了。開始ICE探測需要調用pj_ice_strans_start_ice()方法.
- 需要注意的是,PJNATH庫不支持直接處理SDP消息,SDP消息的封裝與拆解還需應用程序自己實現。
- 一旦ICE的探測協商開始后,程序最終將會在回調函數on_ice_complete() 中返回。on_ice_complete() 屬於結構體: pj_ice_strans_cb.
- 應用程序在程序運行的任何時刻都能發送或者接受數據,但是ICE的stream transport 對象它能否發送數據,取決於它發送數據時候的狀態。狀態分為三種:1,探測協商之前,這種狀態下可以發送數據,並且使用的是默認的地址;2,探測協商的過程中,此時不能發送數據;3,探測協商完成之后,這種狀態下也可以發送數據,且發送數據的地址為探測成功的地址對!
- 應用程序使用pj_ice_strans_sendto()發送數據,並在pj_ice_strans_cb的on_rx_data()回調中返回.
- 當需要結束媒體Session時,使用pj_ice_strans_stop_ice()回收ICE Session。
關於ICE stream transport,在單次媒體交互完成后,可以選擇銷毀ICE stream transport或保留它以備后用。保留ICE stream transport有利有弊,好處是減少下次會話時創建它的時間;壞處是應用程序需要與STUN server以及relay server中相應的端口保活,這會無形中造成電量的損耗(consume power), 而電量損耗的高低是移動設備應用的重要參考標准之一。
轉載請注明:
名稱:pjsip教程(三)之ICE stream transport的使用
作者:大雪先生