一. 概述數組
二. 主要變量服務器
三. 主要方法tcp
四. 在Sipdroid中的應用ide
在整套Sipdroid源碼中, 類SipProvider是最靠近TCP/UDP的一層, 在Sipdroid實現的SIP協議棧中扮演底層樞紐的角色(前一篇文章中介紹的SipdroidEngine扮演的是上層樞紐), 這一角色也能夠從該類是Configurable, TransportListener, TcpServerListener的繼承體現出來.spa
向下層, SipProvider和通訊傳輸層進行交互, 包括接收Transport的回調, 向Transport傳遞要發送的msgcode
向上層, SipProvider和UI交互, 包括根據msg觸發指定Transaction回調, 從而通知Call再到UserAgentserver
若是接收到的msg, 沒有與其匹配的method_id, transaction_id或dialog_id, 就用ANY標識對象
public static final Identifier ANY = new Identifier("ANY");
public static final Identifier PROMISQUE = new Identifier("PROMISQUE");
在SipProviderListener中, 簡單的接口定義和回調方法聲明, 接口的對象listeners將會在SipProvider類中發揮重要的做用.blog
public void onReceivedMessage(SipProvider sip_provider, Message message);
listeners對象很關鍵, SipProvider提供的上下層樞紐功能都是要通過對應listener的被動觸發和任務派發, Indentifier的值會在下面介紹.繼承
Hashtable<Identifier, SipProviderListener> listeners = null;
/*TCP/UDP相關*/ String[] transport_protocols = null; boolean transport_udp = false; boolean transport_tcp = false; static UdpTransport udp = null; TcpServer tcp_server = null; /*Socket相關*/ SocketAddress outbound_proxy = null; private String outbound_addr = null; private int outbound_port = -1;
首先, 從宏觀上了解SipProvider類, 須要明確如下三個問題:
1. SipProvider的生命週期伴隨Sipdroid核心引擎的全過程
SipdroidEngine.StartEngine(): 在Sipdroid應用"引擎"初始化的時候初始化
SipdroidEngine.halt(): 在Sipdroid應用"引擎"終止的時候終止
2. 初始化SipProvider要完成哪些事情
SipProvider具備鏈接傳輸層和UA,RA的功能, 因此須要初始化和傳輸, 監聽相關的變量, 好比傳輸協議, IP和端口, 服務器地址, 監聽對象的哈希表
public SipProvider(String via_addr, int port, String[] protocols, String ifaddr) { init(via_addr, port, protocols, ifaddr); initlog(); startTrasport(); }
3. 初始化SipProvider後程序發生的變化
根據全局變量LINES的值, 肯定了每一個應用中初始化的sip_providers對象數組的大小.
我刪掉了和SipProviderListener無關的代碼, 這樣就可以顯著看到Listener HashTable的變化狀況: 在註冊前逐個增長listeners, 當註冊成功後, 和Register有關的listeners都被刪除.
I/System.out: SipProvider: adding SipProviderListener: 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975 I/System.out: SipProvider: SipProviderListener: size=1, listeners=412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, I/System.out: SipProvider: adding SipProviderListener: INVITE I/System.out: SipProvider: SipProviderListener: size=2, listeners=INVITE, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, I/System.out: SipProvider: adding SipProviderListener: OPTIONS I/System.out: SipProvider: SipProviderListener: size=3, listeners=INVITE, OPTIONS, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, I/System.out: SipProvider: adding SipProviderListener: 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870 I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870,
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- I/System.out: SipProvider: removing SipProviderListener: NOTIFY I/System.out: SipProvider: WARNING: trying to remove a missed SipProviderListener. I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870, I/System.out: SipProvider: adding SipProviderListener: NOTIFY I/System.out: SipProvider: SipProviderListener: size=5, listeners=INVITE, OPTIONS, NOTIFY, 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870, I/System.out: SipProvider: removing SipProviderListener: 412269425175@10.15.3.73-1-REGISTER-null-z9hG4bK26975 I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, NOTIFY, 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870, I/System.out: SipProvider: removing SipProviderListener: 412269425175@10.15.3.73-2-REGISTER-null-z9hG4bK84870 I/System.out: SipProvider: SipProviderListener: size=3, listeners=INVITE, OPTIONS, NOTIFY,
I/System.out: SipProvider: removing SipProviderListener: INVITE I/System.out: SipProvider: SipProviderListener: size=2, listeners=OPTIONS, NOTIFY, I/System.out: SipProvider: adding SipProviderListener: 847642009035@10.15.3.73-z9hG4bK06452429-null I/System.out: SipProvider: SipProviderListener: size=3, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-z9hG4bK06452429-null, I/System.out: SipProvider: adding SipProviderListener: 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053 I/System.out: SipProvider: SipProviderListener: size=4, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-z9hG4bK06452429-null, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, I/System.out: SipProvider: adding SipProviderListener: 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097 I/System.out: SipProvider: SipProviderListener: size=5, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-z9hG4bK06452429-null, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097,
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- I/System.out: SipProvider: removing SipProviderListener: 847642009035@10.15.3.73-z9hG4bK06452429-null I/System.out: SipProvider: SipProviderListener: size=4, listeners=OPTIONS, NOTIFY, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097, I/System.out: SipProvider: adding SipProviderListener: INVITE I/System.out: SipProvider: SipProviderListener: size=5, listeners=INVITE, OPTIONS, NOTIFY, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097, I/System.out: SipProvider: adding SipProviderListener: OPTIONS I/System.out: SipProvider: WARNING: trying to add a SipProviderListener with a id that is already in use. I/System.out: SipProvider: SipProviderListener: size=5, listeners=INVITE, OPTIONS, NOTIFY, 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097, I/System.out: SipProvider: removing SipProviderListener: 847642009035@10.15.3.73-1-INVITE-null-z9hG4bK26053 I/System.out: SipProvider: SipProviderListener: size=4, listeners=INVITE, OPTIONS, NOTIFY, 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097, I/System.out: SipProvider: removing SipProviderListener: 847642009035@10.15.3.73-2-INVITE-null-z9hG4bK50097 I/System.out: SipProvider: SipProviderListener: size=3, listeners=INVITE, OPTIONS, NOTIFY,
就像每一個產品會配一個產品經理同樣, 每一個UA和RA都會配一個sip_provider, 負責這個UA或RA的消息監聽, 接收和處理.