关于模块的博文原文在这里: https://blog.csdn.net/smllyy/article/details/40820721
1) PJSIP模块结构体
struct pjsip_module
{
PJ_DECL_LIST_MEMBER(struct pjsip_module); //链表指针
pj_str_t name;
int id; //Application must initialize this field with -1 before registering the module to PJSIP
int priority; //模块ID在模块注册到Endpoint时决定
pj_status_t (*load)(pjsip_endpoint *endpt); //Module should return PJ_SUCCESS to indicate success
pj_status_t (*start)(void); //return zero to indicate success
pj_status_t (*stop)(void);
pj_status_t (*unload)(void);
pj_bool_t (*on_rx_request)(pjsip_rx_data *rdata);
pj_bool_t (*on_rx_response)(pjsip_rx_data *rdata);
pj_status_t (*on_tx_request)(pjsip_tx_data *tdata);
pj_status_t (*on_tx_response)(pjsip_tx_data *tdata);
void (*on_tsx_state)(pjsip_transaction *tsx, pjsip_event *event); //on_tsx_state()在接收到请求或响应重传时,不会被调用
//传送或接收临时响应并不属于重传,因此传送或接收临时响应将会引起该回调函数
};
参考博文有几张图帮助我们理解消息处理流程,摘录如下:
1) PJSIP模块结构体
struct pjsip_module
{
PJ_DECL_LIST_MEMBER(struct pjsip_module); //链表指针
pj_str_t name;
int id; //Application must initialize this field with -1 before registering the module to PJSIP
int priority; //模块ID在模块注册到Endpoint时决定
pj_status_t (*load)(pjsip_endpoint *endpt); //Module should return PJ_SUCCESS to indicate success
pj_status_t (*start)(void); //return zero to indicate success
pj_status_t (*stop)(void);
pj_status_t (*unload)(void);
pj_bool_t (*on_rx_request)(pjsip_rx_data *rdata);
pj_bool_t (*on_rx_response)(pjsip_rx_data *rdata);
pj_status_t (*on_tx_request)(pjsip_tx_data *tdata);
pj_status_t (*on_tx_response)(pjsip_tx_data *tdata);
void (*on_tsx_state)(pjsip_transaction *tsx, pjsip_event *event); //on_tsx_state()在接收到请求或响应重传时,不会被调用
//传送或接收临时响应并不属于重传,因此传送或接收临时响应将会引起该回调函数
};
某些PJSIP组件(结构体)有一个容器(一个void指针数组),可用来存放针对特定模块的特定数据,这个容器叫做mod_data,用模块ID作为索引
例如,事务层会将匹配的事务实例存放到mod_data中,UA层也会将匹配的dialog实例存放到mod_data中。应用可以调用pjsip_rdata_get_tsx()或者pjsip_rdata_get_dlg()来获取这些数据
参考博文有几张图帮助我们理解消息处理流程,摘录如下:
1)模块状态机, 涉及模块结构体前4个接口函数, 若接口指针为NULL, 则sip_endpoint默认为对该接口调用结果是SUCCESS
2)incoming 消息处理,模块调用示意图
3)新会话+新事务 incoming消息处理流程
4)事务内incoming消息处理流程
5) 会话内新事务incoming消息处理