为什么用它
因为使用pjsip的c接口,太麻烦了。
同时因为项目使用的是c++,自己也要封装,最后选择了它们提供的pjsua2的类接口。感觉还不错。就是有些地方要注意一下。
注意的地方
因为pjsua2仅仅是对pjsip库的c++封装,因此pjsip有的问题,pjsua2也肯定有。
反注册没有回调
注册成功了会有注册状态变化的回调接口调用。注销之后就没有了。
其实想想也对。注销信号发送之后就不用获取返回验证了。
这里分情况
如果调用的
m_pAccount0->setRegistration(false);
则在Account类中会有回调。
如果调用的是shutdown则不会有回调。
多账户的管理
某些高级一点的还是需要c接口的。eg:枚举当前所有的账户。
我还没找到好的办法。
/*
* Get number of current accounts.
*/
PJ_DEF(unsigned) pjsua_acc_get_count(void)
/*
* Enum accounts info.
*/
PJ_DEF(pj_status_t) pjsua_acc_enum_info( pjsua_acc_info info[],
unsigned *count )
从 pjsua_acc_enum_info 获取到每一个的id,然后调用 Account *Account::lookup(int acc_id),就可以得到Account *,再转换成你自己的指针。
Account 在调用 create的时候,会把自己的指针传进去。
账户相关的函数
pjsua_acc_is_valid(id)
注销之后还能外呼
不知道这算不算bug,调用注销之后,还能外呼。但是不能呼入了。
我抓了一下包,证实了确实发送了注销消息。
modify 函数
/**
* Modify the account to use the specified account configuration.
* Depending on the changes, this may cause unregistration or
* reregistration on the account.
*
* @param cfg New account config to be applied to the
* account.
*/
void modify(const AccountConfig &cfg) PJSUA2_THROW(Error);
如果account本身注册状态,那么它就会在更新后发起注册。如果本事不是注册状态,那么它就仅仅是更新信息。
setOnlineStatus 函数
这个是给订阅了消息的小伙伴看的。
这个暂时没用过。
通话中注销
在通话的过程中将Account注销。
发现通话竟然还能继续。看起来像是账户跟通话底层没关联似的。