Files
gb28181/GB28181Device/sip/sip_inc.h
2024-12-15 20:42:32 +08:00

381 lines
11 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/***************************************************************************************
*
* 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