From 10821ac3a7ff876618b681cb54c40f23b48b8959 Mon Sep 17 00:00:00 2001 From: Hu Chunming <2657262686@qq.com> Date: Tue, 30 Apr 2024 17:52:25 +0800 Subject: [PATCH] 1.定时刷新设备目录; 2.无鉴权注册; 3.修复注册时client为null导致崩溃的问题 4.返回invite返回值 --- sip/SipServer.cpp | 40 +++++++++++++++++++++++----------------- sip/SipServer.h | 12 ++++++++++-- sip/WebSocketServer.cpp | 6 +++++- 3 files changed, 38 insertions(+), 20 deletions(-) diff --git a/sip/SipServer.cpp b/sip/SipServer.cpp index d84f13c..c68e651 100644 --- a/sip/SipServer.cpp +++ b/sip/SipServer.cpp @@ -66,6 +66,9 @@ SipServer::SipServer(): } #endif // WIN32 + mClientMap.clear(); + m_device_map.clear(); + } SipServer::~SipServer() { LOG_INFO("~SipServer"); @@ -253,7 +256,7 @@ void SipServer::event_loop() { LOG_INFO("sip server init succeed: {}:{}", mInfo.getIp(), mInfo.getPort()); - // thread* timing_getcatlog_threadptr = new std::thread(timing_getcatlog_thread, this); + thread* timing_getcatlog_threadptr = new std::thread(timing_getcatlog_thread, this); while(!mQuit) { eXosip_event_t *evtp = eXosip_event_wait(mSipCtx, 0, 20); @@ -268,11 +271,11 @@ void SipServer::event_loop() { } mQuit = true; - // if (timing_getcatlog_threadptr) { - // timing_getcatlog_threadptr->join(); - // delete timing_getcatlog_threadptr; - // timing_getcatlog_threadptr = nullptr; - // } + if (timing_getcatlog_threadptr) { + timing_getcatlog_threadptr->join(); + delete timing_getcatlog_threadptr; + timing_getcatlog_threadptr = nullptr; + } } void SipServer::Close() { @@ -374,7 +377,7 @@ void SipServer::response_register(eXosip_event_t *evtp) { if (!memcmp(calc_response, Response, HASHHEXLEN)) { this->response_message_answer(evtp,200); - cacheClient(contact->url); + cacheClient(contact->url, expire); } else { this->response_message_answer(evtp,401); LOG_INFO("Camera registration error, p={},port={},device={}", strdup(contact->url->host), atoi(contact->url->port), strdup(username)); @@ -388,22 +391,28 @@ void SipServer::response_register(eXosip_event_t *evtp) { osip_free(uri); } else { response_register_401unauthorized(evtp); - cacheClient(contact->url); + cacheClient(contact->url, expire); } } -void SipServer::cacheClient(osip_uri_t *url) { +void SipServer::cacheClient(osip_uri_t *url, int expiry) { string sip_id = strdup(url->username); + long cur_ts = Utools::get_cur_time_ms(); + // 已经注册的不再注册 std::lock_guard l(m_client_map_mtx); auto it = mClientMap.find(sip_id); if (it != mClientMap.end()) { + it->second->setExpiry(expiry); + it->second->updateHeartBeat(cur_ts); return ; } Client* client = new Client(strdup(url->host), atoi(url->port), strdup(url->username)); + client->setExpiry(expiry); + client->updateHeartBeat(cur_ts); LOG_INFO("Camera registration succee,ip={},port={},device={}",client->getIp(),client->getPort(),client->getDevice()); @@ -474,9 +483,10 @@ void SipServer::response_message(eXosip_event_t *evtp) { this->response_message_answer(evtp,200); // LOG_INFO("CmdType={},DeviceID={}", CmdType, DeviceID); std::lock_guard l_c(m_client_map_mtx); - Client* client = mClientMap[DeviceID]; - if (client != nullptr) { - client->updateHeartBeat(Utools::get_cur_time_ms()); + auto it = mClientMap.find(DeviceID); + if (it != mClientMap.end()) { + it->second->updateHeartBeat(Utools::get_cur_time_ms()); + return ; } }else{ this->response_message_answer(evtp,200); @@ -783,9 +793,8 @@ void SipServer::dump_request(eXosip_event_t *evtp) { if (s) { LOG_INFO("\nprint request start\ntype={}\n{}\nprint request end\n",evtp->type,s); } - - LOG_INFO("REQUEST cid:{} did: {}",evtp->cid, evtp->did); } + void SipServer::dump_response(eXosip_event_t *evtp) { char *s = nullptr; size_t len; @@ -794,7 +803,4 @@ void SipServer::dump_response(eXosip_event_t *evtp) { { LOG_INFO("\nprint response start\ntype={}\n{}\nprint response end\n",evtp->type,s); } - - - LOG_INFO("RESPONSE cid:{} did: {}",evtp->cid, evtp->did); } \ No newline at end of file diff --git a/sip/SipServer.h b/sip/SipServer.h index d6ae29e..09dfcab 100644 --- a/sip/SipServer.h +++ b/sip/SipServer.h @@ -55,6 +55,14 @@ public: mHeartBeatTime = ts; } + long getExpiry() { + return mExipry; + } + + void setExpiry(long expiry) { + mExipry = expiry; + } + private: string mIp; // client ip int mPort; // client port @@ -62,7 +70,7 @@ private: bool mIsReg; int mRtpPort; unsigned long mHeartBeatTime{0}; - + long mExipry{0}; }; @@ -92,7 +100,7 @@ private: void RequestCatalog(Client* client); void cacheCatalog(); - void cacheClient(osip_uri_t *url); + 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); diff --git a/sip/WebSocketServer.cpp b/sip/WebSocketServer.cpp index d1c7f9e..b82a35b 100644 --- a/sip/WebSocketServer.cpp +++ b/sip/WebSocketServer.cpp @@ -57,9 +57,13 @@ int WebSocketServer::msg_parser(websocketpp::connection_hdl hdl, string msg) { string ip = get_ip_from_hdl(hdl); + string response_msg = ""; + int ret = -100; if ( StringTools::to_lower(vec_msg[0]) == "invite") { ret = parse_invite(vec_msg, ip); + response_msg = vec_msg[2] + "_" + vec_msg[3] +"|" + vec_msg[0] + "|" + vec_msg[1] + "|" + to_string(ret); + ws_server.send(hdl, response_msg, websocketpp::frame::opcode::text); } else if ( StringTools::to_lower(vec_msg[0]) == "bye") { if (StringTools::to_lower(vec_msg[1]) == "invite") { std::cout << "bye invite: " << vec_msg[2] << std::endl; @@ -85,7 +89,7 @@ void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr ms try { int ret = msg_parser(hdl,msg->get_payload()); // 返回执行结果 - ws_server.send(hdl, to_string(ret), websocketpp::frame::opcode::text); + // ws_server.send(hdl, to_string(ret), websocketpp::frame::opcode::text); } catch (websocketpp::exception const & e) { std::cout << "Echo failed because: " << "(" << e.what() << ")" << std::endl; ws_server.send(hdl, to_string(-101), websocketpp::frame::opcode::text); -- libgit2 0.21.4