PJSUA2開發文檔--第五章 帳戶(號)Accounts


第五章 帳戶(號

 

帳戶提供正在使用該應用程序的用戶的身份(或身份)。一個帳戶有一個與之相關的SIP統一資源標識符(URI)。在SIP術語中,該URI用作該人的記錄地址( Address of Record,AOR),並且用作傳出請求中的From頭。

帳戶可能有也可能沒有與之相關聯的客戶注冊。帳戶也與路由集和一些認證憑證相關聯,這些憑證在使用該帳戶發送SIP請求消息時使用。帳戶還具有狀態,當它們訂閱該帳戶時,該狀態將被報告給遠端(遠程對等體),或者如果為該帳戶啟用了發布,則該狀態發布到呈現(Presence)服務器。

必須在應用程序中創建至少一個帳戶,因為任何外發請求都需要一個帳戶上下文。如果不需要用戶關聯,應用程序可以通過調用Account.create()來創建一個無用戶帳戶。無用戶帳戶識別本地端點而不是特定用戶,並且它對應於特定的傳輸ID。

還有一個帳戶必須設置為默認帳戶,當pjsua使用更嚴格的匹配規則無法將傳入請求與任何帳戶匹配時,用作帳戶身份。

5.1 子類化Account類(從Account類繼承的子類)

要使用Account類,通常應用程序應該創建自己的子類,以便接收該帳戶的通知。例如:

class MyAccount : public Account

{

public:

    MyAccount() {}

    ~MyAccount() {}

 

    virtual void onRegState(OnRegStateParam &prm)

    {

        AccountInfo ai = getInfo();

        cout << (ai.regIsActive? "*** Register: code=" : "*** Unregister: code=")

             << prm.code << endl;

    }

 

    virtual void onIncomingCall(OnIncomingCallParam &iprm)

    {

        Call *call = new MyCall(*this, iprm.callId);

 

        // Just hangup for now

        CallOpParam op;

        op.statusCode = PJSIP_SC_DECLINE;

        call->hangup(op);

 

        // And delete the call

        delete call;

    }

};

 

在其子類中,應用程序可以實現帳戶回調,基本用於處理與該帳戶相關的事件,如:

  • SIP注冊的狀態
  • 傳入呼叫
  • 傳入存在訂閱請求
  • 不是從伙伴傳入的即時消息

應用程序需要覆蓋派生類中的相關回調方法來處理這些特定事件。

如果未處理事件,將調用默認操作:

  • 來電將不被處理
  • 傳入的存在訂閱請求將被接受
  • 來自非伙伴的傳入即時消息將被忽略

5.2 創建無用戶帳戶

無用戶帳戶標識特定SIP端點,而不是特定用戶。一些其他SIP軟電話可以稱之為對等模式,這意味着我們通過其地址呼叫另一台計算機,而不是調用特定的用戶ID。例如,我們可能會將自己標識為“ sip:192.168.0.15 ”(無用戶帳戶),而不是“ sip:alice@pjsip.org ”。

在下層PJSUA-LIB API中,無用戶帳戶與SIP傳輸相關聯,並且使用pjsua_acc_add_local()API 創建。這個概念在PJSUA2中已經被棄用了,而且一個無用戶帳號是一個沒有用戶名的ID URI(例如“ sip:192.168.0.15 ”),是一個沒有注冊的“正常”賬戶。因此,創建無用戶帳戶與創建“正常”帳戶完全相同。

5.3 創建帳號

我們需要配置AccountConfig並調用Account.create()來創建帳戶。至少,pjsua只需要帳戶的ID,這是一個URI來標識帳戶(或者在SIP術語中,它被稱為記錄地址/ AOR)。以下是一個代碼片段:

AccountConfig acc_cfg;

acc_cfg.idUri = "sip:test1@pjsip.org";

 

MyAccount *acc = new MyAccount;

try {

    acc->create(acc_cfg);

} catch(Error& err) {

    cout << "Account creation error: " << err.info() << endl;

}

 

以上創建的帳戶不會執行任何操作,除非在發件人的“發件人”標題中提供身份。該帳戶不會注冊到SIP服務器或任何東西。

通常,將希望該帳戶認證並注冊到SIP服務器,以便可以接收來電。為此,需要在AccountConfig中配置一些更多設置,如下所示:

AccountConfig acc_cfg;

acc_cfg.idUri = "sip:test1@pjsip.org";

acc_cfg.regConfig.registrarUri = "sip:pjsip.org";

acc_cfg.sipConfig.authCreds.push_back( AuthCredInfo("digest", "*", "test1", 0, "secret1") );

 

MyAccount *acc = new MyAccount;

try {

    acc->create(acc_cfg);

} catch(Error& err) {

    cout << "Account creation error: " << err.info() << endl;

}

 

5.4 帳戶配置

在AccountConfig中可以指定更多的設置,如:

  • AccountRegConfig,指定注冊設置,如注冊服務器和重試間隔。
  • AccountSipConfig,用於指定SIP設置,如憑證信息和代理服務器。
  • AccountCallConfig,用於指定呼叫設置,例如是否需要可靠的臨時響應(SIP 100rel)。
  • AccountPresConfig來指定狀態設置,例如是否啟用在線發布(PUBLISH)。
  • AccountMwiConfig,指定MWI(留言等待指示)設置。
  • AccountNatConfig,用於指定NAT設置,例如是否使用STUN或ICE。
  • AccountMediaConfig,用於指定媒體設置,如安全RTP(SRTP)相關設置。
  • AccountVideoConfig,用於指定視頻設置,如默認捕獲和渲染設備。

有關更多信息,請參閱AccountConfig參考文檔。

5.5 帳戶操作

Account對象的一些操作:

  • 管理注冊
  • 管理好友/聯系人
  • 管理在線狀態

請參閱帳戶的參考文檔了解更多信息。呼叫,存在和好友將在后面的章節中進行說明。

5.6 類參考

類參考

5.6.1 Account帳號

class pj::Account

帳戶 

公有函數

1)Account()

構造函數

2)virtual ~Account()

析構器

請注意,如果該帳戶被刪除,它也將刪除PJSUA-LIB中的相應帳戶。

3)void create(const AccountConfig&cfg,bool make_default = false )

創建帳戶

參數cfg -帳號配置

make_default -將其設為默認帳戶。

4)void modify(const AccountConfig&cfg )修改帳戶以使用指定的帳戶配置。根據變更,這可能會導致帳戶的注銷或重新注冊。

參數cfg -要應用於帳戶的新帳戶配置。

5)bool isValid() const檢查此帳戶是否仍然有效。

返回 true如果有效

6)void setDefault()

將此設置為默認帳戶以在傳入和傳出請求與任何帳戶不匹配時使用。

返回 PJ_SUCCESS成功。

7)bool isDefault() const檢查這個帳戶是否是默認帳戶。默認帳戶將用於與任何其他帳戶不匹配的傳入和傳出請求。

返回 如果這是默認帳戶,則為true。

8)INT getId() const獲取與此帳戶相關聯的PJSUA-LIB帳戶ID或索引。

返回 整數大於或等於零。

9)AccountInfo getInfo() const獲取帳戶信息。

返回 帳戶信息。

10)void setRegistration( bool renew ) 更新注冊或執行注銷。如果要手動更新注冊或從服務器注銷,通常只需要調用此函數。

參數renew - 如果是false,將執行注銷。

11)void setOnlineStatus(const PresenceStatus&pres_st )設置或修改要發布給遠程/現場訂閱帳戶的在線狀態。如果此帳戶有服務器端存在訂閱,和/或出站PUBLISH(如果此帳戶啟用了存在發布),則會觸發發送傳出的NOTIFY請求。

參數 pres_st - 在線狀態。

12)void setTransport(TransportId tp_id )將此帳戶鎖定/綁定到特定的傳輸/偵聽器。

通常,應用程序不需要這樣做,因為庫將根據目的地自動選擇傳輸。當帳戶被鎖定/綁定到特定的傳輸時,來自該帳戶的所有傳出請求將使用指定的傳輸(包括SIP注冊,對話(呼叫和事件訂閱)以及諸如MESSAGE之類的對話外請求)。注意,傳輸ID也可以在AccountConfig中指定。

參數 tp_id - 傳輸ID。

13)void presNotify(const PresNotifyParam&prm )發送NOTIFY以通知帳戶存在狀態或終止服務器端存在訂閱

如果應用程序想要拒絕傳入的請求,它應該將PresNotifyParam.state的參數設置為PJSIP_EVSUB_STATE_TERMINATED。

參數prm -發送NOTIFY參數。

14)const BuddyVector&enumBuddies() const

枚舉帳戶的所有好友。

返回 好友列表。

15)buddy * findBuddy(string URI,FindBuddyMatch * buddy_match = NULL ) const在具有指定URI的好友列表中找到一個好友。

異常:如果沒有找到好友,PJ_ENOTFOUND將被拋出。

返回 指向好友的指針

參數 uri -好友URI。

buddy_match -好友匹配算法

16)void addBuddy(Buddy * buddy )一個內部功能,將一個好友添加到帳戶好友列表。應用程序不能使用此功能。

17)void removeBuddy(Buddy * buddy )

從帳戶好友列表中刪除好友的內部功能。應用程序不能使用此功能。

18)virtual void onIncomingCall(OnIncomingCallParam&prm )來電時通知應用程序。

參數prm -回調參數

19)virtual void onRegStarted(OnRegStartedParam&prm )注冊或注銷登記時通知申請。

注意,這只會通知初始注冊和注銷。一旦注冊會話處於活動狀態,后續刷新將不會導致此回調被調用。

參數prm - 回調參數

20)virtual void onRegState(OnRegStateParam&prm )注冊狀態發生變化時通知申請。應用程序可能會查詢帳戶信息以獲取注冊詳細信息。

參數prm -回調參數

21)virtual void onIncomingSubscribe(OnIncomingSubscribeParam&prm )收到傳入SUBSCRIBE請求時的通知。

應用程序可以使用此回調來授權傳入的訂閱請求(例如,如果請求被授予,請求用戶許可)。

如果未實現此回調,則將接受所有傳入的存在訂閱請求。

如果實現這個回調,在處理傳入的請求時應用程序有幾個選擇:

它可以通過在IncomingSubscribeParam.code參數中指定非200類最終響應立即拒絕該請求。

它可以通過指定200作為IncomingSubscribeParam.code參數來立即接受該請求。如果應用程序未設置任何值給IncomingSubscribeParam.code參數,則這是默認值。在這種情況下,庫將從該回調返回時自動發送NOTIFY請求。

它可能延遲處理請求,例如要求用戶許是接受還是拒絕請求。在這種情況下,該應用程序必須設置IncomingSubscribeParam.code參數202,然后立即調用presNotify()與狀態PJSIP_EVSUB_STATE_PENDING,並在之后調用presNotify()再次接受或拒絕訂閱請求。

200和202以外的任何IncomingSubscribeParam.code將被視為200。

應用程序必須立即從此回調中返回(例如,在等待用戶確認時不得阻止此回調)。

參數prm - 回調參數

22)virtual void onInstantMessage(OnInstantMessageParam&prm )調用上下文接收通知應用程序傳入的即時消息或尋呼(即消息請求)

參數prm - 回調參數

23)virtual void onInstantMessageStatus(OnInstantMessageStatusParam&prm )

通知應用程序傳送狀態,關於傳出尋呼/即時消息(即,MESSAGE)請求的傳送狀態。

參數prm -回調參數

24)virtual void onTypingIndication(OnTypingIndicationParam&prm )通知應用程序打字指示。

參數prm -回調參數

25)virtual void onMwiInfo(OnMwiInfoParam&prm )

關於MWI(消息等待指示Message Waiting Indication)狀態變化的通知。

可以在SUBSCRIBE請求的狀態更改(例如,202 /接收到SUBSCRIBE被接收)或接收到NOTIFY reqeust時調用此回調。

參數prm -回調參數

 

公共靜態功能

26)static Account * lookup( int acc_id )

獲取指定帳戶ID 的帳戶類。

返回 該帳戶實例或NULL(如果沒有找到)。

參數acc_id -要查找的帳號

 

5.6.2 AccountInfo

struct pj::AccountInfo

struct pj::AccountInfo

#include <account.hpp> 

帳戶信息。

應用程序可以通過調用Account :: getInfo ()來查詢帳戶信息。

5.6.3 帳戶設置

1)AccountConfig

struct pj::AccountConfig

帳戶配置,從pj :: PersistentObject繼承

 

2)AccoutRegConfig

struct pj::AccountRegConfig

帳戶注冊配置,在AccountConfig中指定。從pj :: PersistentObject繼承

3)AccountSipConfig

struct pj::AccountSipConfig

帳戶的各種SIP設置。在AccountConfig中指定。從pj :: PersistentObject繼承

4)AccountCallConfig

struct pj::AccountCallConfig

帳戶的通話設置。在AccountConfig中指定。從pj :: PersistentObject繼承

5)AccountPresConfig

struct pj::AccountPresConfig

帳戶存在配置。這將在AccountConfig中指定。從pj :: PersistentObject繼承

6)AccountMwiConfig

struct pj::AccountMwiConfig帳號 MWI(留言等待指示,Message Waiting Indication)設置。

在AccountConfig中指定。從pj :: PersistentObject繼承

7)AccountNatConfig

struct pj::AccountNatConfig帳戶的NAT(網絡地址轉換)設置

在AccountConfig中指定。從pj :: PersistentObject繼承

8)AccountMediaConfig

struct pj::AccountMediaConfig帳戶媒體配置(適用於音頻和視頻)

在AccountConfig中指定。從pj :: PersistentObject繼承

9)AccountVideoConfig

struct pj::AccountVideoConfig帳號視頻配置

在AccountConfig中指定。從pj :: PersistentObject繼承

5.6.4 回調參數

10)struct pj::OnIncomingCallParam

此結構包含onIncomingCall()帳戶回調的參數。

11)struct pj::OnRegStartedParam

此結構包含onRegStarted()帳戶回調的參數。

12)struct pj::OnRegStateParam

此結構包含onRegState()帳戶回調的參數。

13)struct pj::OnIncomingSubscribeParam

此結構包含onIncomingSubscribe()回調的參數。

14)struct pj::OnInstantMessageParam

onInstantMessage()帳戶回調的參數。

15)struct pj::OnInstantMessageStatusParam

onInstantMessageStatus()帳戶回調的參數。

16)struct pj::OnTypingIndicationParam

onTypingIndication()帳戶回調的參數。

17)struct pj::OnMwiInfoParam

onMwiInfo()帳戶回調的參數。

18)struct pj::PresNotifyParam

presNotify()帳戶方法的參數。

5.6.5 其他

class pj::FindBuddyMatch

Buddy匹配算法的包裝類。

默認算法是Buddy URI 中搜索令牌的簡單子字符串查找,區分大小寫。應用程序可以通過覆蓋此類並在Account :: findBuddy()中指定其實例來實現自己的匹配算法。

公有函數

19)virtual bool match(const string&token,const Buddy&buddy )

默認算法實現。

20)virtual ~FindBuddyMatch()

析構器

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM