first commit
This commit is contained in:
380
GB28181Device/sip/sip_inc.h
Normal file
380
GB28181Device/sip/sip_inc.h
Normal 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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user