#ifndef __SIPSERVER_H__ #define __SIPSERVER_H__ extern "C" { #include #include } #include #include #include #include #include #include #include "./Message/CatalogParser.h" #include "sip_header.h" using namespace std; class Client { public: Client(string ip, int port, string device) : mIp(ip), mPort(port), mDevice(device) { mRtpPort = 0; mIsReg = false; } ~Client() = default; public: void setRtpPort(int rtpPort) { mRtpPort = rtpPort; } void setReg(bool isReg) { mIsReg = isReg; } string getDevice() const{ return mDevice; } string getIp() const{ return mIp; } int getPort() const{ return mPort; } unsigned long getHeartBeat() { return mHeartBeatTime; } void updateHeartBeat(unsigned long ts) { mHeartBeatTime = ts; mHeartBeatCount++; if (mHeartBeatFirst <= 0){ mHeartBeatFirst = ts; } } unsigned long getHeartBeatGap() { if (mHeartBeatCount >= 2) { return (mHeartBeatTime - mHeartBeatFirst)/mHeartBeatCount ; } return 0; } long getExpiry() { return mExipry; } void setExpiry(long expiry) { mExipry = expiry; } private: string mIp; // client ip int mPort; // client port string mDevice;// 340200000013200000024 bool mIsReg; int mRtpPort; unsigned long mHeartBeatTime{0}; unsigned long mHeartBeatFirst{0}; unsigned long mHeartBeatGap{1}; unsigned long mHeartBeatCount{0}; long mExipry{0}; }; class WebSocketServer; class SipServer { public: SipServer(); ~SipServer(); bool Init(ServerInfo* pInfo, WebSocketServer* pServer); int RequestInvite_UDP(const char* dst_channel, const char* rtpIp, int rtpPort); int RequestInvite_TCP_a(const char* dst_channel, const char* rtpIp, int rtpPort); int ByeInvite(std::string channel_id, string ip, int rtpPort); void Close(); public: void event_loop(); void timing_getcatlog(); private: int init_sip_server(); int sip_event_handle(eXosip_event_t *evtp); void RequestCatalog(Client* client); void cacheCatalog(); void RequestDeviceInfo(Client* client); void cacheClient(osip_uri_t *url, int expiry); void response_message_answer(eXosip_event_t *evtp,int code); void response_register(eXosip_event_t *evtp); void response_register_noauth(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 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); int clearClientMap(); void deleteClientByDevice(string device); Client* get_parent_by_id(string id); bool check_device_status(string id); void cache_invite_callinfo(eXosip_event_t *evtp); int reInvite(int cid); int check_device_type(string sip_id); private: bool mQuit{ false }; eXosip_t *mSipCtx; ServerInfo mInfo; std::map mClientMap;// mutex m_client_map_mtx; std::map m_device_map; mutex m_device_map_mtx; thread* m_event_loop_thread{nullptr}; mutex m_invite_callinfo_map_mtx; std::map< tuple, CallInfo> m_invite_callinfo_map; mutex m_invite_cmd_map_mtx; std::map< tuple, string> m_invite_cmd_map; WebSocketServer* m_pWsServer; }; #endif //__SIPSERVER_H__