關於這項作業
B2BUA 是一種「階段作業起始通訊協定 (SIP)」應用程式,位於 SIP 呼叫中間,可在兩個以上的 SIP 對話之間轉遞要求和回應。一般的 B2BUA 應用程式會管理兩個使用者代理程式之間的 SIP 階段作業。不過,B2BUA 應用程式也可以處理更複雜的實務,在這類實務中,它需要管理下游分岔中不同分支的回應。當要求分割成不同的分支,且訊息會從使用者代理程式用戶端轉遞給使用者代理程式伺服器時,就會出現下游分岔。
B2buaHelper 類別含有建立這類 B2BUA 應用程式的所有必要方法。
B2buaHelper 類別的行為和用來建立新要求的規則,定義在 JSR289 規格第 12.2 節中。您可以使用
B2buaHelper 類別函數,來鏈結 SIP 後端對後端使用者代理程式的兩個 Leg(送入的呼叫 Leg 和送出的呼叫 Leg)。
- 呼叫 SipServletRequest.getB2buaHelper() 方法,來擷取 B2buaHelper 實例。
- 擷取這個實例之後,您可以呼叫 B2buaHelper.createRequest(),以建立新的 SIP 要求。
private void doInvite(SipServletRequest req) {
B2buaHelper b2buaHelper = req.getB2buaHelper();
SipServletRequest newRequest = b2buaHelper.createRequest(req, true, headerMap);
}
所建立的 newRequest,與在這個方法的第一個參數中提供作為原始要求的 SipServletRequest
req 相同。Boolean 參數指出原始要求 req 與 newRequest 是否鏈結。headerMap 提供
newRequest 中所置換之非系統標頭的對映。
- 請確定兩個 Leg 已鏈結。如果您呼叫設有 false 屬性的 createRequest 方法,您可以呼叫下列來明確鏈結 SIP 階段作業:
B2buaHelper.linkSipSessions(session1, session2)
- 鏈結 SIP 階段作業與 SIP 要求之後,您可以呼叫下列來擷取所鏈結的階段作業:
SipSession linkedSession = B2buaHelper.getLinkedSession(req.getSession());
註: 在 B2BUA 分岔實務中,應用程式會建立多個 SIP 要求,因此不是所有的 SIP 階段作業都會鏈結。您必須明確鏈結它們。
- 收到「使用者代理程式伺服器 (UAS)」的回應之後,請建立要傳給其 Leg 的回應。請檢查以判斷回應中所鏈結的階段作業是否存在,若是,請使用所鏈結的要求,來建立要傳給「使用者代理程式用戶端 (UAC)」的回應。
SipServletRequest linked = b2bHelper.getLinkedSipServletRequest(resp.getRequest());
linked.createResponse(resp.getStatus(),resp.getReasonPhrase()).send();
如果回應沒有與任何鏈結的階段作業相關聯,應用程式需要呼叫 B2buaHelper.createResponseToOriginalRequest,並建立衍生的新階段作業,而這是原始要求相關聯之 SipSession 的副本。
註: JSR289 規格第 12.5 節提供方法來建立多個要傳給原始要求的成功回應。如果原始 INVITE 訊息有多個相關聯的 SipSession,且需要傳送多個成功回應給 INVITE 訊息,請使用
B2buaHelper.createResponseToOriginalRequest 方法。
- 如果您使用 createResponseToOriginalRequest 方法,請確定兩個 Leg 已鏈結。您的應用程式負責將衍生的新階段作業鏈結至其配對階段作業,這樣它就可以擷取鏈結的階段作業,以便傳送其後續的回應。