開源的SIP協議棧 PJSIP
PJSIP是一個開放源代碼的SIP協議棧。它支持多種SIP的擴展功能,目前可說算是最流行的sip協議棧之一了。
下面列出其重要的幾種優點:
1)代碼層次非常清晰,從低級到高級都提供了很方便的接口供開發;
2)提供相當多的測試用例和一個基于pjsip開發的命令行UA程序供開發人員參考;
3).高度的可移殖性
只需簡單的編譯一次,它能夠在多種平臺上運行(所有Windows 系統列, Windows Mobile, Linux, 所有Unix 系列, MacOS X, RTEMS, Symbian OS, 等等)。
4).極小的內存需求
官方宣稱編譯后的庫,完全實現SIP的功能只需要150K的內存空間,這使得PJISPi不僅僅是嵌入開發的理想平臺,并且實用于那些內存運行于極小內存平臺的應用,這也意味著極小的用戶下載時間。
5).高效的性能
這意味著極小的CPU運算需求下能同時實現更多的通話。
6).支持多種SIP功能及擴展功能
多種SIP功能和擴展功能,例如多人會話,事件驅動框架,會話控制(presence),即時信息,電話傳輸,等等在庫文件里得以實現。
7).豐富的文檔資料
對于軟件開發人員來說,文檔資料從來都是多多益善,因此我們要求PJSIP開發人員提供了大量的極有價值的文檔資料供大家使用
其實說是PJSIP不是特別貼切,這個庫實際上是幾個部分組成的.
1).PJSIP - Open Source SIP Stack[開源的SIP協議棧]
2).PJMEDIA - Open Source Media Stack[開源的媒體棧]
3).PJNATH - Open Source NAT Traversal Helper Library[開源的NAT-T輔助庫]
4).PJLIB-UTIL - Auxiliary Library[輔助工具庫]
5).PJLIB - Ultra Portable Base Framework Library[基礎框架庫]
PJLIB簡介
要理解好PJSIP,就不得不先說說PJLIB,PJLIB算的上是這個庫中最基礎的庫,正是這個
庫的優美實現,才讓PJSIP變得如此優越。
PJLIB提供了一系列特征,這是我們下面分析的重點,涉及到:
1).非動態內存分配[No Dynamic Memory Allocations]
實現了內存池,獲取內存是從與分配的內存池中獲取,高性能程序多會自己構造內存池
,后面我們會解釋該內存池的使用以及基本的原理。根據作者的比較,是常規的 malloc(
)/free()函數的30倍。
2).OS抽象[Operating System Abstraction]
實現OS抽象的根本原因在與可移植性,毋庸置疑:).
涉及到:
a).線程[Threads.]
b).線程本地存儲[Thread Local Storage.]
c).互斥[Mutexes.]
d).信號燈[Semaphores.]
e).原子變量[Atomic Variables.]
f).臨屆區[Critical sections.]
g).鎖對象[Lock Objects.]
h).事件對象[Event Object.]
i).時間管理[Time Data Type and Manipulation.]
j).高解析的時間戳[High Resolution Timestamp.]
等等,這些我們后面分析代碼時一一看來:)
3).低層的網絡相關IO[Low-Level Network I/O]
這涉及到:
a).Socket抽象[Socket Abstraction.]
b).網絡地址解析[Network Address Resolution.]
c).實現針對Socket的select API[Socket select() API.]
4).時間管理[Timer Management]
這主要涉及到兩個部分,一個時定時器的管理,還有就是時間解析的精度(舉例說來,就是能精確到哪個時間等級,比如 POSIX sleep(),就只能以秒為單位,而使用select()則可以實現毫秒級別的計時)