381 lines
11 KiB
C
381 lines
11 KiB
C
/***************************************************************************************
|
||
*
|
||
* IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING.
|
||
*
|
||
* By downloading, copying, installing or using the software you agree to this license.
|
||
* If you do not agree to this license, do not download, install,
|
||
* copy or use the software.
|
||
*
|
||
* Copyright (C) 2014-2022, Happytimesoft Corporation, all rights reserved.
|
||
*
|
||
* Redistribution and use in binary forms, with or without modification, are permitted.
|
||
*
|
||
* Unless required by applicable law or agreed to in writing, software distributed
|
||
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
|
||
* CONDITIONS OF ANY KIND, either express or implied. See the License for the specific
|
||
* language governing permissions and limitations under the License.
|
||
*
|
||
****************************************************************************************/
|
||
|
||
#ifndef SIP_INC_H
|
||
#define SIP_INC_H
|
||
|
||
#include "sys_inc.h"
|
||
#include "linked_list.h"
|
||
|
||
/*************************************************************************/
|
||
|
||
#define MAX_NUM_SUA 8
|
||
#define MAX_NUM_SIP_USER 1
|
||
|
||
#define SIP_MSG_EXIT 4 // 要求消息接收任务退出
|
||
#define SIP_MSG_SRC 1
|
||
#define SIP_TIMER_SRC 2
|
||
#define SIP_RETCP_SRC 3 // SIP/TCP连接需要重新连接
|
||
#define RTP_DTMF_SRC 5
|
||
#define MEDIA_VIDEO_SRC 6
|
||
#define MEDIA_AUDIO_SRC 7
|
||
#define SUA_DEL_SRC 8
|
||
|
||
#define SUA_NTF_SRC 100 // 协议层向上发送的消息
|
||
#define SUA_CMD_SRC 101 // 会话管理层向协议层发送的消息
|
||
#define SIP_PMSG_SRC 102 // TCP SIP接收处理
|
||
|
||
#define SIP_MAX_BUFF (10*1024)
|
||
|
||
/*************************************************************************/
|
||
|
||
typedef enum puas_event
|
||
{
|
||
PUEVT_NULL = 0,
|
||
PUEVT_REGING, //注册进行中
|
||
PUEVT_REG_PASS, //注册认证成功
|
||
PUEVT_REG_FAIL, //注册认证失败
|
||
PUEVT_CALL_IN, //呼叫进入
|
||
PUEVT_CALL_OUT, //呼叫发出
|
||
PUEVT_AUTH_REQ, //呼叫认证
|
||
PUEVT_AUTH_PASS, //呼叫认证
|
||
PUEVT_AUTH_FAIL, //呼叫认证
|
||
PUEVT_TIMEOUT, //状态超时
|
||
PUEVT_M_TIMEOUT, //接通状态中很长时间没有RTP包通过
|
||
PUEVT_M_DTMF, //一般是媒体转发部分提交的事件
|
||
PUEVT_S_DTMF, //SIP-INFO/H245得到的DTMF
|
||
PUEVT_ALERT, //用户振铃
|
||
PUEVT_CONNECT, //接通
|
||
PUEVT_REINVITE, //reInvite修改媒体信息
|
||
PUEVT_HANGUP, //用户挂机
|
||
PUEVT_BUSY, //用户忙
|
||
PUEVT_CANCEL_FINISH, //呼叫已经取消 487
|
||
PUEVT_CALL_TERMINATE, //呼叫已经终止 487
|
||
PUEVT_TMEP_UNAVAILABLE, //对方临时不可用 480
|
||
PUEVT_CALL_FORBIDDEN, //对方禁止呼叫 403 Forbidden
|
||
PUEVT_ERROR, //一般错误原因不明
|
||
PUEVT_LINE_FREE, //该呼叫资源释放
|
||
|
||
PUEVT_R_MSG, //收到消息
|
||
PUEVT_ROSTER_RLY, //添加联系人反馈
|
||
PUEVT_ROSTER_ADD, //被添加联系人消息
|
||
|
||
PUEVT_ROSTER_STATE, //联系人状态(可能是: unavailable,available,leave,busy)
|
||
PUEVT_ROSTER_NEW, //新联系人
|
||
PUEVT_ROSTER_DEL, //协议要求删除联系人
|
||
PUEVT_CAMERA_ALARM, //摄像头报警事件
|
||
|
||
PUEVT_T_MSG_F, //发送消息失败
|
||
PUEVT_M_VIDEO_OK, //视频准备好
|
||
|
||
PUEVT_MAX
|
||
}PUAEVT;
|
||
|
||
/*************************************************************************/
|
||
typedef enum puas_cmd
|
||
{
|
||
PUCMD_NULL = 0,
|
||
PUCMD_ALERTING, //会话管理:振铃,180、183
|
||
PUCMD_DISCONNECT, //会话管理:拆除连接
|
||
PUCMD_FORBID, //会话管理:禁止该呼叫
|
||
PUCMD_BUSY, //会话管理:对端线路忙
|
||
PUCMD_NOUSER, //会话管理:用户不存在
|
||
|
||
PUCMD_CONNECT, //会话管理:接通
|
||
PUCMD_ACCEPT, //会话管理:接受更改/变化
|
||
PUCMD_REJECT, //会话管理:拒绝更改/变化
|
||
|
||
PUCMD_CALL, //会话管理:发出呼叫
|
||
PUCMD_REINVITE, //会话管理:更改会话
|
||
|
||
PUCMD_PLAY, //会话管理:播放语音文件/视频图像
|
||
PUCMD_REFER, //会话管理:转接呼叫
|
||
PUCMD_UPLOAD_JPG, //会话管理:上传抓拍JPG文件
|
||
PUCMD_UPLOAD_VRF, //会话管理:上传录像剪辑文件
|
||
|
||
PUCMD_TMSG, //会话管理:发送文本消息
|
||
PUCMD_AROSTER, //会话管理:添加联系人
|
||
PUCMD_DROSTER, //会话管理:删除联系人
|
||
|
||
PUCMD_MAX
|
||
}PUACMD;
|
||
|
||
/*************************************************************************/
|
||
typedef enum sip_request_msg_type
|
||
{
|
||
SIP_MT_NULL = 0,
|
||
SIP_MT_ACK, //肯定应答请求
|
||
SIP_MT_BYE, //结束呼叫
|
||
SIP_MT_CAN, //取消还未建立起来的呼叫
|
||
SIP_MT_INV, //邀请
|
||
SIP_MT_OPT, //查询
|
||
SIP_MT_REG, //注册
|
||
SIP_MT_MSG, //即时消息
|
||
SIP_MT_SUB, //订阅
|
||
SIP_MT_NTF, //通知
|
||
SIP_MT_REF, //REFER呼叫转接
|
||
SIP_MT_UPD, //更改媒体编码等呼叫信息
|
||
SIP_MT_PRACK,
|
||
SIP_MT_INFO
|
||
} SIP_MT;
|
||
|
||
typedef enum sip_call_event_enum
|
||
{
|
||
CSE_NULL = 0,
|
||
CSE_Call_Recv,
|
||
CSE_Call_Send,
|
||
CSE_Message_Recv,
|
||
CSE_Message_Send,
|
||
CSE_Ring_Send,
|
||
CSE_Cancel_Recv,
|
||
CSE_Cancel_Send,
|
||
CSE_Hang_Recv,
|
||
CSE_Hang_Send,
|
||
|
||
CSE_Update_Recv,
|
||
CSE_Update_Send,
|
||
CSE_PRACK_Recv,
|
||
CSE_PRACK_Send,
|
||
CSE_Refer_Recv,
|
||
CSE_Refer_Send,
|
||
CSE_Info_Recv,
|
||
CSE_Info_Send,
|
||
|
||
CSE_202_Recv,
|
||
CSE_3xx_Recv,
|
||
CSE_4xx_Recv,
|
||
CSE_5xx_Recv,
|
||
CSE_6xx_Recv,
|
||
CSE_100_Recv,
|
||
CSE_180_Recv,
|
||
CSE_IOK_Recv,
|
||
|
||
CSE_180_Send, //不带SDP信息,本地向用户放回铃音
|
||
CSE_180_SDP_Send, //带SDP信息,即将向对方放回铃音
|
||
CSE_183_SDP_Send, //带SDP信息,即将向对方放回铃音
|
||
CSE_IOK_Send, //带SDP信息,呼叫即将接通
|
||
|
||
CSE_MOK_Recv,
|
||
CSE_COK_Recv,
|
||
CSE_UOK_Recv, // UPDATE 200 OK
|
||
|
||
CSE_ACK_Recv,
|
||
CSE_ACK_Send,
|
||
|
||
CSE_BOK_Recv,
|
||
|
||
CSE_OTHER_SHUTDOWN, //呼叫中的另外一方已经关闭
|
||
CSE_OTHER_TIMEOUT, //呼叫中的另外一方状态超时
|
||
CSE_TIMEOUT,
|
||
CSE_RTP_ECHO_TIMEOUT,
|
||
|
||
CSE_Call_Cancel, //用户取消呼叫事件
|
||
CSE_Call_Refer,
|
||
|
||
CSE_Call_Auth_Pass,
|
||
CSE_Call_Auth_Fail,
|
||
CSE_Call_Auth_Wait,
|
||
|
||
CSE_DTMF,
|
||
|
||
CSE_SRV_DROP, //业务层丢弃该呼叫
|
||
CSE_NO_SRV, //没有对应的业务处理
|
||
CSE_HTTP_AUTH, //需要进行HTTP Digest认证
|
||
CSE_CALLER_AUTH, //需要进行主叫号码认证
|
||
}CSEVT;
|
||
|
||
/*************************************************************************/
|
||
typedef enum hsip_crpty_mode
|
||
{
|
||
HCRPTY_NULL = 0, //消息不加密
|
||
HCRPTY_HSP, //HSP加密模式
|
||
HCRPTY_GS //潮流加密模式
|
||
} HSIP_CRPTY_MODE;
|
||
|
||
/*************************************************************************/
|
||
typedef struct hsip_via_header
|
||
{
|
||
char sip_ver[16]; //版本:一般是SIP/2.0/UDP
|
||
uint32 ip; //宣称的地址,如果为零及可能是域名
|
||
char domain[64]; //当ip == 0 时,使用该单元
|
||
uint16 port; //宣称的端口
|
||
|
||
uint32 real_ip; //实际ip地址,只需要处理第一个via消息
|
||
uint16 real_port; //实际端口,主要是客户端在NAT的环境会出现这种情况
|
||
char branch[128];
|
||
char * via_string; //消息文本
|
||
} HSIP_VIAH;
|
||
|
||
/*************************************************************************/
|
||
typedef enum context_type
|
||
{
|
||
SIP_CTX_NULL = 0,
|
||
SIP_CTX_SIP,
|
||
SIP_CTX_SDP,
|
||
SIP_CTX_TXT,
|
||
SIP_CTX_HTM,
|
||
SIP_CTX_XML,
|
||
SIP_CTX_ALARM,
|
||
SIP_CTX_PTZ,
|
||
SIP_CTX_VRF,
|
||
SIP_CTX_MANSRTSP
|
||
} SIPCTXT;
|
||
|
||
#define MANSCDP_Control 1
|
||
#define MANSCDP_Notify 2
|
||
#define MANSCDP_Query 3
|
||
#define MANSCDP_Response 4
|
||
|
||
typedef struct hsip_msg_content
|
||
{
|
||
uint32 msg_type; //消息类别:0表示是request,1表示是response
|
||
uint32 msg_sub_type; //可能是invite,ack等请求类型,也可能是401/1xx/200等回应状态码
|
||
HSIP_CRPTY_MODE msg_crpty_mode; //消息加密模式
|
||
HDRV first_line;
|
||
|
||
PPSN_CTX via_ctx;
|
||
PPSN_CTX sip_ctx;
|
||
PPSN_CTX sdp_ctx;
|
||
|
||
int sip_len;
|
||
int sdp_len;
|
||
|
||
SIPCTXT ctx_type;
|
||
int ctx_len;
|
||
|
||
int manscdp; // 28181 功能类型
|
||
char cmdt[32]; // 28181 命令类型
|
||
|
||
char * msg_buf;
|
||
int buf_mlen;
|
||
int buf_offset;
|
||
|
||
uint32 remote_ip;
|
||
uint16 remote_port;
|
||
uint16 local_port;
|
||
uint32 local_ip;
|
||
}HSIP_MSG;
|
||
|
||
/*************************************************************************/
|
||
typedef enum hsip_auth_state
|
||
{
|
||
HSIP_AUTH_IDLE = 0, //空闲状态,用户不在线
|
||
HSIP_AUTH_INIT, //已经发送开始注册的消息,客户端使用
|
||
HSIP_AUTH_CHAP_RX, //服务器已经发送WWW-Authenticate
|
||
HSIP_AUTH_RADIUS_WAIT,
|
||
HSIP_AUTH_200, //认证成功,服务器已经发送200 OK消息
|
||
HSIP_AUTH_FAIL //认证失败
|
||
} HSIP_AUTH_STATE;
|
||
|
||
typedef struct hsip_user_info
|
||
{
|
||
uint32 usrf_used : 1; //该表项使用标志
|
||
uint32 usrf_auth : 1; //用户认证标识
|
||
uint32 usrf_nat_inside : 1; //用户是否在NAT后面
|
||
uint32 usrf_tcp_sip : 1; //使用SIP OVER TCP
|
||
uint32 usrf_tcp_rtp : 1; //使用TCP-RTP模式
|
||
uint32 usrf_reserved : 27; //标志: 保留
|
||
|
||
HSIP_CRPTY_MODE user_crpty_mode; //该用户消息加密模式
|
||
|
||
HSIP_AUTH_STATE user_state; //用户状态
|
||
|
||
SOCKET sip_fd;
|
||
uint16 sip_port;
|
||
|
||
char user_name[MAX_USRL]; //用户名/H323 E164号码
|
||
char user_disp_name[128]; //显示名称/H323-ID
|
||
char user_auth_passwd[MAX_NUML]; //用户密码,本地认证时使用/H235密码
|
||
char user_sip_addr[128]; //sip地址,类似:<sip:8675528@inponex.com>
|
||
|
||
char user_ip[24]; //用户信令ip地址
|
||
uint16 user_port; //用户信令端口(仅支持UDP)
|
||
char user_real_ip[24]; //用户信令真正ip地址(NAT之后)
|
||
uint16 user_real_port; //用户信令真正端口(仅支持UDP)(NAT之后)
|
||
|
||
time_t last_reg_time; //最近一次注册成功的时间
|
||
uint32 expires_time; //超时时长
|
||
|
||
uint32 last_tx_time; //最近发送时间
|
||
uint32 last_rx_time; //最近接收时间
|
||
uint32 last_hb_time; //最近发送心跳的时间
|
||
|
||
char server_ipstr[24]; //对应这个用户的服务器侧的ip地址
|
||
uint16 server_port; //对应这个用户的服务器侧的端口
|
||
char server_agent[64]; //服务器类型
|
||
char server_id[64]; //服务器自己的ID
|
||
char server_sip_addr[64]; //服务器SIP地址
|
||
|
||
char user_domain[64]; //用户所处的域
|
||
|
||
HD_AUTH_INFO user_auth_info;
|
||
|
||
char auth_call_id[128]; //摘要认证注册时的会话ID
|
||
uint32 auth_cseq; //摘要认证注册时的会话CSeq
|
||
char auth_f_tag[128];
|
||
char user_contact_uri[128];
|
||
|
||
HSIP_VIAH auth_via;
|
||
|
||
uint32 notify_cseq; //SUBSCRIBE/NOTIFY消息使用的CSeq
|
||
uint32 message_cseq; //消息序列号
|
||
uint32 gb28181_sn; //28181消息序列号
|
||
uint32 hb_tm_count; //心跳超时或错误响应次数
|
||
|
||
char user_agent_desc[128]; //用户终端AGENT描述
|
||
|
||
// TCP模式下的接收缓冲区
|
||
char rcv_buf[2048]; //接收缓冲区
|
||
char * dyn_recv_buf;
|
||
int rcv_dlen; //缓冲区中已经存在数据长度
|
||
int sip_len;
|
||
int sdp_len;
|
||
char * p_rbuf; // --> rcv_buf or dyn_recv_buf
|
||
int mlen; // = sizeof(rcv_buf) or size of dyn_recv_buf
|
||
}HSIP_USER;
|
||
|
||
/*************************************************************************/
|
||
typedef struct sip_task_msg
|
||
{
|
||
uint32 msg_src;
|
||
uint32 msg_param;
|
||
uint32 src_ip;
|
||
uint32 src_port;
|
||
uint32 dst_port;
|
||
int msg_len;
|
||
char * msg_buf;
|
||
void * msg_lock; //如果该消息锁存在,则发送线程已经停止,等待接收线程处理完消息
|
||
} SIPTM;
|
||
|
||
/*************************************************************************/
|
||
|
||
// SIP事件通知回调
|
||
typedef void (*SIPNTFC)(uint32 index, PUAEVT evt, void * p_ctx, int len, void * p_usrdata);
|
||
|
||
// SIP呼叫状态回调
|
||
typedef void (*SIPCALLCBF)(void * sua, int evt, void * p_usrdata);
|
||
|
||
// RTP接收回调
|
||
typedef int (*RTPRXCBF)(void * sua, uint8 * p_data, int len, uint32 ts, uint16 seq, void * p_usrdata);
|
||
|
||
|
||
#endif // SIP_INC_H
|
||
|
||
|