first commit

This commit is contained in:
wdp
2024-12-15 20:42:32 +08:00
commit 986b2fca12
586 changed files with 154149 additions and 0 deletions

380
GB28181Device/sip/sip_inc.h Normal file
View File

@@ -0,0 +1,380 @@
/***************************************************************************************
*
* 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