Sipdroid實現SIP(四): 傳輸層和應用層之間的樞紐SipProvider

目錄

一. 概述數組

二. 主要變量服務器

三. 主要方法tcp

四. 在Sipdroid中的應用ide

 


 

一. 概述

在整套Sipdroid源碼中, 類SipProvider是最靠近TCP/UDP的一層, 在Sipdroid實現的SIP協議棧中扮演底層樞紐的角色(前一篇文章中介紹的SipdroidEngine扮演的是上層樞紐), 這一角色也能夠從該類是Configurable, TransportListener, TcpServerListener的繼承體現出來.spa

向下層, SipProvider和通訊傳輸層進行交互, 包括接收Transport的回調, 向Transport傳遞要發送的msgcode

向上層, SipProvider和UI交互, 包括根據msg觸發指定Transaction回調, 從而通知Call再到UserAgentserver

 


 

二.  主要變量

2.1 監聽標識之一: ANY

若是接收到的msg, 沒有與其匹配的method_id, transaction_id或dialog_id, 就用ANY標識對象

public static final Identifier ANY = new Identifier("ANY");

2.2 監聽標識之二: PROMISQUE

public static final Identifier PROMISQUE = new Identifier("PROMISQUE");

2.3 監聽對象哈希表

在SipProviderListener中, 簡單的接口定義和回調方法聲明, 接口的對象listeners將會在SipProvider類中發揮重要的做用.blog

public void onReceivedMessage(SipProvider sip_provider, Message message); 

listeners對象很關鍵, SipProvider提供的上下層樞紐功能都是要通過對應listener的被動觸發和任務派發, Indentifier的值會在下面介紹.繼承

Hashtable<Identifier, SipProviderListener> listeners = null;

2.4 通訊協議相關

/*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;

 


 

三. 主要方法

3.1 初始化SipProvider

首先, 從宏觀上了解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對象數組的大小.

3.2 應用啓動時SipProvider監聽者列表的變化過程(註冊成功):

我刪掉了和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,

 

3.3 呼叫請求時監聽者列表的變化過程(呼叫失敗)

 

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,

 

3.4 從"哈希監聽者列表"刪除一個SipProvider監聽


 

 四. 在Sipdroid中的應用

就像每一個產品會配一個產品經理同樣, 每一個UA和RA都會配一個sip_provider, 負責這個UA或RA的消息監聽, 接收和處理.

相關文章
相關標籤/搜索