/*************************************************************************************** * * 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地址,类似: 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