-
Notifications
You must be signed in to change notification settings - Fork 27
/
SipServer.h
144 lines (127 loc) · 3.54 KB
/
SipServer.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
//
// Created bxc on 2022/11/25.
//
#ifndef BXC_SIPSERVER_SIPSERVER_H
#define BXC_SIPSERVER_SIPSERVER_H
extern "C" {
#include <osip2/osip_mt.h>
#include <eXosip2/eXosip.h>
}
#include <map>
#include <string>
class ServerInfo {
public:
ServerInfo(const char *ua,const char *nonce, const char *ip, int port, int rtpPort,
const char *sipId, const char *sipRealm, const char *sipPass, int sipTimeout, int sipExpiry):
mUa(ua),
mNonce(nonce),mIp(ip),mPort(port),mRtpPort(rtpPort),mSipId(sipId),
mSipRealm(sipRealm),mSipPass(sipPass),mSipTimeout(sipTimeout),
mSipExpiry(sipExpiry){}
~ServerInfo() = default;
public:
const char *getUa() const{
return mUa;
}
const char * getNonce() const{
return mNonce;
}
const char * getIp() const{
return mIp;
}
int getPort() const {
return mPort;
}
int getRtpPort() const {
return mRtpPort;
}
const char * getSipId() const{
return mSipId;
}
const char * getSipRealm() const{
return mSipRealm;
}
const char * getSipPass() const{
return mSipPass;
}
int getTimeout() const {
return mSipTimeout;
}
int getExpiry() const {
return mSipExpiry;
}
private:
const char *mUa;
const char *mNonce;//SIP服务随机数值
const char *mIp;//SIP服务IP
int mPort;//SIP服务端口
const char *mSipId; //SIP服务器ID
const char *mSipRealm;//SIP服务器域
const char *mSipPass;//SIP password
int mSipTimeout; //SIP timeout
int mSipExpiry;// SIP到期
int mRtpPort; //SIP-RTP服务端口
};
class Client {
public:
Client(const char *ip, int port, const char *device) :
mIp(ip),
mPort(port),
mRtpPort(0),
mDevice(device),
mIsReg(false){
}
~Client() = default;
public:
void setRtpPort(int rtpPort) {
mRtpPort = rtpPort;
}
void setReg(bool isReg) {
mIsReg = isReg;
}
const char * getDevice() const{
return mDevice;
}
const char * getIp() const{
return mIp;
}
int getPort() const{
return mPort;
}
private:
// step1
const char *mIp; // client ip
int mPort; // client port
const char *mDevice;// 340200000013200000024
// step2
bool mIsReg;
// step3
int mRtpPort{};
};
class SipServer {
public:
explicit SipServer(ServerInfo *info);
~SipServer();
public:
void loop();
private:
int init_sip_server();
int sip_event_handle(eXosip_event_t *evtp);
void response_message_answer(eXosip_event_t *evtp,int code);
void response_register(eXosip_event_t *evtp);
void response_register_401unauthorized(eXosip_event_t *evt);
void response_message(eXosip_event_t *evtp);
void response_invite_ack(eXosip_event_t *evtp);
int request_bye(eXosip_event_t* evtp);// 通知相机停止推流
int request_invite(const char *device,const char *userIp,int userPort);
int parse_xml(const char* data, const char* s_mark, bool with_s_make, const char* e_mark, bool with_e_make, char* dest);
void dump_request(eXosip_event_t *evtp);
void dump_response(eXosip_event_t *evtp);
private:
bool mQuit;
struct eXosip_t *mSipCtx;
ServerInfo *mInfo;
std::map<std::string, Client *> mClientMap;// <DeviceID,SipClient>
int clearClientMap();
Client * getClientByDevice(const char * device);
};
#endif //BXC_SIPSERVER_SIPSERVER_H