10 13 |
PJSIP-SIP stack的明日之星作者: Joey 日期: 2008-10-13 18:29 |
最近假日真多,連續破了好幾個遊戲,如”鬼屋魔影5”,”末日之戰-彈頭”…等,不過發現近視度數好像加深了,看東西都糊糊的,不過這樣也好,年紀大時老花眼不會這麼快來
話說這一陣子都在玩SIP的東東,也成功的把PJSIP porting在有DSP的板子上運作(板子上的DSP可以直接編解碼RTP,所以我修改PJSIP以便攔截RTP),而藉著PJSIP強大的函式庫,我的程式除了硬體控制的部份外,其它SIP控制的部份零零總總加起來可能連100行都不到,由此可見PJSIP封裝的能力,但難能可貴的是以下幾點
1.它實在很好移植-好像有網友已經把PJSIP擺在PSP上了
2.明確的程式架構-PJSIP的架構讓讀它的人很爽
3.詳細的說明文件-就是這點贏過oSIP,Sofia SIP…等
先來看看PJSIP的模組架構如下圖
由上圖中可知道PJSIP一共擁有10大模組,而從模組的描述可概略看出每個模組負責的功能,如PJNATH的功能就是做STUN,PJMEDIA-CODEC就是負責RTP編解碼,而最重要的部份就是PJSUA這個模組,它除了函蓋下面模組的功能外,也把這些模組的介面封裝成易懂易用的API給programmer快速開發softphone
我在這邊舉的pjsip-IM範例是用PJSIP-UA兜出來的測試程式碼,所以還沒用到PJSUA,不過可藉由這個的範例瞭解PJSIP對於INVITE,200 OK,ACK, BYE…等控制訊息的操作方式
SIP的transaction與dialog的概念圖如下,由下圖可知道,transaction 1包含了Invite,Ringing,OK與ACK, transaction 2包含了Bye與OK,而這兩段transaction同屬於一個dialog
PJSIP的程式架構與上面所提及的概念對應,請參考下圖
當TRANSPORT MANAGER收到SIP封包時,會把其內的SIP event通知上層的ENDPOINT,而ENDPOINT會找到對應的接收者,並把event傳給Transaction layer然後再傳給UA layer(傳遞的順序由每個模組的優先權決定), 如果UA layer的程式有指定要處理transaction的event,Transaction layer也會把解析後的event傳給UA layer,而UA處理事件的註冊方式請參考以下程式
我這邊傳遞訊息的範例就是做完transaction 1(Invite,OK,ACK)後,UAC與UAS可互傳訊息給對方(outside dialog),當要結束對話時,再作transaction 2(Bye,OK),詳細的內容請參考這份原始碼,編譯的方式請參考這篇文章
執行時先執行UAS,然後再執行UAC,執行UAC時請下命令參數uac sip:simpleuac@[your IP],就可以觀察uac與uas的連線情況,執行時如下圖
Cross compile pjsip的方法也很簡單,請參考我之前交叉編譯的文章,但configure後記得要更改build.mak這個檔案,把export CROSS_COMPILE :=改為arm-linux-,如果binary用static的方式連接PJSIP library,那傳訊息的範例程式大約為700多k,算是相當精簡了,但如果用PJSUA的library,可能會到1MB多
在我寫這篇文章時,PJSIP已經出了正式release的版本了,我覺得PJSIP的作者真是厲害,常常看到他晚上1,2點還在回mailing list,可能是還沒結婚吧,不過open source多了這位奇材,真是我們的福氣
Regular expression-跟brainfuck差不多的東西 (2009-11-13 15:37)
Reading file in kernel-簡單但實用 (2009-10-13 15:18)
Linux file system for dummies-只花你45分鐘 (2009-08-19 15:40)
OPENSSL-TCP SSL初心者之路 (2009-07-16 15:16)
NAPI與pure interrupt driver的效能比較 (2009-04-29 19:06)
usermode helper-來自kernel的呼喚 (2009-04-21 16:19)
kernel module memory detector-抓出有害的kernel module (2009-03-31 13:50)
kernel space coding-如履薄冰 (2009-03-26 09:52)
readahead與posix_advise-預讀取是萬能靈丹? (2009-03-06 15:54)