Commit 0af3b245b7aa28aa80125ee4588398636ecb9041

Authored by Hu Chunming
1 parent 5b86d771

添加多nvr和多摄像头管理

bin/libcares.so 0 → 100755
No preview for this file type
bin/libcares.so.2 0 → 100755
No preview for this file type
bin/libcares.so.2.5.1 0 → 100755
No preview for this file type
src/decoder/gb28181/sip/SipServer.cpp
@@ -318,6 +318,14 @@ void SipServer::response_register_401unauthorized(eXosip_event_t *evtp) { @@ -318,6 +318,14 @@ void SipServer::response_register_401unauthorized(eXosip_event_t *evtp) {
318 318
319 } 319 }
320 320
  321 +void printDevice(std::vector<DeviceInfo> vec_device) {
  322 + LOG_INFO("-----start print----");
  323 + for (size_t i = 0; i < vec_device.size(); i++) {
  324 + LOG_INFO("{} {}", vec_device[i].id, vec_device[i].parentid);
  325 + }
  326 + LOG_INFO("-----end print----");
  327 +}
  328 +
321 void SipServer::response_message(eXosip_event_t *evtp) { 329 void SipServer::response_message(eXosip_event_t *evtp) {
322 330
323 osip_body_t* body = nullptr; 331 osip_body_t* body = nullptr;
@@ -329,19 +337,18 @@ void SipServer::response_message(eXosip_event_t *evtp) { @@ -329,19 +337,18 @@ void SipServer::response_message(eXosip_event_t *evtp) {
329 parse_xml(body->body, "<DeviceID>", false, "</DeviceID>", false, DeviceID); 337 parse_xml(body->body, "<DeviceID>", false, "</DeviceID>", false, DeviceID);
330 } 338 }
331 339
332 -// Client *client = getClientByDevice(DeviceID);  
333 -// if(client){  
334 -// LOG_INFO("response_message:{} 已注册",DeviceID);  
335 -// }else{  
336 -// LOG_ERROR("response_message:{} 未注册",DeviceID);  
337 -// }  
338 - LOG_INFO("CmdType={},DeviceID={}", CmdType, DeviceID); 340 + // LOG_INFO("CmdType={},DeviceID={}", CmdType, DeviceID);
339 341
340 if(!strcmp(CmdType, "Catalog")) { 342 if(!strcmp(CmdType, "Catalog")) {
341 this->response_message_answer(evtp,200); 343 this->response_message_answer(evtp,200);
342 // 需要根据对方的Catelog请求,做一些相应的应答请求 344 // 需要根据对方的Catelog请求,做一些相应的应答请求
343 CCatalogParser catPaser; 345 CCatalogParser catPaser;
344 - m_vec_device = catPaser.Decode_Catlog(body->body); 346 + std::vector<DeviceInfo> vec_device = catPaser.Decode_Catlog(body->body);
  347 + printDevice(vec_device);
  348 + for (size_t i = 0; i < vec_device.size(); i++) {
  349 + DeviceInfo info = vec_device[i];
  350 + m_device_map[info.id] = info;
  351 + }
345 } 352 }
346 else if(!strcmp(CmdType, "Keepalive")){ 353 else if(!strcmp(CmdType, "Keepalive")){
347 this->response_message_answer(evtp,200); 354 this->response_message_answer(evtp,200);
@@ -351,6 +358,20 @@ void SipServer::response_message(eXosip_event_t *evtp) { @@ -351,6 +358,20 @@ void SipServer::response_message(eXosip_event_t *evtp) {
351 358
352 } 359 }
353 360
  361 +Client* SipServer::get_parent_by_id(string id) {
  362 + auto it_info = m_device_map.find(id);
  363 + if (it_info == m_device_map.end()) {
  364 + return nullptr;
  365 + }
  366 + string parent_id = it_info->second.parentid;
  367 + auto it_client = mClientMap.find(parent_id);
  368 + if (it_client == mClientMap.end()) {
  369 + return nullptr;
  370 + }
  371 +
  372 + return mClientMap[parent_id];
  373 +}
  374 +
354 void SipServer::response_invite_ack(eXosip_event_t *evtp){ 375 void SipServer::response_invite_ack(eXosip_event_t *evtp){
355 376
356 osip_message_t* msg = nullptr; 377 osip_message_t* msg = nullptr;
@@ -377,8 +398,10 @@ int SipServer::RequestInvite_UDP(const char* dst_channel, int rtpPort) { @@ -377,8 +398,10 @@ int SipServer::RequestInvite_UDP(const char* dst_channel, int rtpPort) {
377 return -1; 398 return -1;
378 } 399 }
379 400
380 - auto it = mClientMap.begin();  
381 - Client* client = it->second; 401 + Client* client = get_parent_by_id(dst_channel);
  402 + if (client == nullptr) {
  403 + return -1;
  404 + }
382 405
383 LOG_INFO("INVITE UDP"); 406 LOG_INFO("INVITE UDP");
384 407
@@ -391,31 +414,15 @@ int SipServer::RequestInvite_UDP(const char* dst_channel, int rtpPort) { @@ -391,31 +414,15 @@ int SipServer::RequestInvite_UDP(const char* dst_channel, int rtpPort) {
391 414
392 sprintf(from, "sip:%s@%s:%d", mInfo.getSipId().c_str(), mInfo.getIp().c_str(), mInfo.getPort()); 415 sprintf(from, "sip:%s@%s:%d", mInfo.getSipId().c_str(), mInfo.getIp().c_str(), mInfo.getPort());
393 sprintf(to, "sip:%s@%s:%d", dst_channel, client->getIp().c_str(), client->getPort()); 416 sprintf(to, "sip:%s@%s:%d", dst_channel, client->getIp().c_str(), client->getPort());
394 - // snprintf(sdp, 2048,  
395 - // "v=0\r\n"  
396 - // "o=%s 0 0 IN IP4 %s\r\n"  
397 - // "s=Play\r\n"  
398 - // "c=IN IP4 %s\r\n"  
399 - // "t=0 0\r\n"  
400 - // "m=video %d RTP/AVP 96 98 97\r\n"  
401 - // "a=recvonly\r\n"  
402 - // "a=rtpmap:96 PS/90000\r\n"  
403 - // "a=rtpmap:98 H264/90000\r\n"  
404 - // "a=rtpmap:97 MPEG4/90000\r\n"  
405 - // "a=setup:passive\r\n"  
406 - // "a=connection:new\r\n"  
407 - // "y=0100000001\r\n"  
408 - // "f=\r\n", mInfo.getSipId().c_str(), mInfo.getIp().c_str(), mInfo.getIp().c_str(), rtpPort);  
409 -  
410 - snprintf(sdp, 2048, 417 + snprintf(sdp, 2048,
411 "v=0\r\n" 418 "v=0\r\n"
412 "o=%s 0 0 IN IP4 %s\r\n" 419 "o=%s 0 0 IN IP4 %s\r\n"
413 "s=Play\r\n" 420 "s=Play\r\n"
414 "c=IN IP4 %s\r\n" 421 "c=IN IP4 %s\r\n"
415 "t=0 0\r\n" 422 "t=0 0\r\n"
416 - "m=video %d RTP/AVP 98 97\r\n" 423 + "m=video %d RTP/AVP 96 98 97\r\n"
417 "a=recvonly\r\n" 424 "a=recvonly\r\n"
418 - // "a=rtpmap:96 PS/90000\r\n" 425 + "a=rtpmap:96 PS/90000\r\n"
419 "a=rtpmap:98 H264/90000\r\n" 426 "a=rtpmap:98 H264/90000\r\n"
420 "a=rtpmap:97 MPEG4/90000\r\n" 427 "a=rtpmap:97 MPEG4/90000\r\n"
421 "a=setup:passive\r\n" 428 "a=setup:passive\r\n"
@@ -450,8 +457,10 @@ int SipServer::RequestInvite_TCP_a(const char* dst_channel, int rtpPort) { @@ -450,8 +457,10 @@ int SipServer::RequestInvite_TCP_a(const char* dst_channel, int rtpPort) {
450 return -1; 457 return -1;
451 } 458 }
452 459
453 - auto it = mClientMap.begin();  
454 - Client* client = it->second; 460 + Client* client = get_parent_by_id(dst_channel);
  461 + if (client == nullptr) {
  462 + return -1;
  463 + }
455 464
456 LOG_INFO("INVITE TCP active"); 465 LOG_INFO("INVITE TCP active");
457 466
@@ -558,15 +567,7 @@ int SipServer::clearClientMap(){ @@ -558,15 +567,7 @@ int SipServer::clearClientMap(){
558 return 0; 567 return 0;
559 } 568 }
560 569
561 -Client * SipServer::GetClientByDevice(string device) {  
562 - auto it = mClientMap.find(device);  
563 - if(it == mClientMap.end()){  
564 - return nullptr;  
565 - }  
566 - return it->second;  
567 -}  
568 -  
569 -void SipServer::DeleteClientByDevice(string device) { 570 +void SipServer::deleteClientByDevice(string device) {
570 auto it = mClientMap.find(device); 571 auto it = mClientMap.find(device);
571 if (it == mClientMap.end()) { 572 if (it == mClientMap.end()) {
572 return ; 573 return ;
@@ -576,14 +577,6 @@ void SipServer::DeleteClientByDevice(string device) { @@ -576,14 +577,6 @@ void SipServer::DeleteClientByDevice(string device) {
576 mClientMap.erase(it); 577 mClientMap.erase(it);
577 } 578 }
578 579
579 -std::map<std::string, Client*> SipServer::GetClientMap() {  
580 - return mClientMap;  
581 -}  
582 -  
583 -std::vector< DeviceInfo > SipServer::GetDeviceList() {  
584 - return m_vec_device;  
585 -}  
586 -  
587 int SipServer::parse_xml(const char *data, const char *s_mark, bool with_s_make, const char *e_mark, bool with_e_make, char *dest) { 580 int SipServer::parse_xml(const char *data, const char *s_mark, bool with_s_make, const char *e_mark, bool with_e_make, char *dest) {
588 const char* satrt = strstr( data, s_mark ); 581 const char* satrt = strstr( data, s_mark );
589 582
src/decoder/gb28181/sip/SipServer.h
@@ -130,13 +130,6 @@ public: @@ -130,13 +130,6 @@ public:
130 130
131 bool Init(ServerInfo info); 131 bool Init(ServerInfo info);
132 132
133 - Client* GetClientByDevice(string device);  
134 - void DeleteClientByDevice(string device);  
135 -  
136 - std::vector< DeviceInfo > GetDeviceList();  
137 -  
138 - std::map<std::string, Client*> GetClientMap();  
139 -  
140 int RequestInvite_UDP(const char* dst_channel, int rtpPort); 133 int RequestInvite_UDP(const char* dst_channel, int rtpPort);
141 134
142 int RequestInvite_TCP_a(const char* dst_channel, int rtpPort); 135 int RequestInvite_TCP_a(const char* dst_channel, int rtpPort);
@@ -163,6 +156,9 @@ private: @@ -163,6 +156,9 @@ private:
163 void dump_response(eXosip_event_t *evtp); 156 void dump_response(eXosip_event_t *evtp);
164 157
165 int clearClientMap(); 158 int clearClientMap();
  159 + void deleteClientByDevice(string device);
  160 +
  161 + Client* get_parent_by_id(string id);
166 162
167 private: 163 private:
168 bool mQuit{ false }; 164 bool mQuit{ false };
@@ -170,8 +166,7 @@ private: @@ -170,8 +166,7 @@ private:
170 ServerInfo mInfo; 166 ServerInfo mInfo;
171 167
172 std::map<std::string, Client *> mClientMap;// <DeviceID,SipClient> 168 std::map<std::string, Client *> mClientMap;// <DeviceID,SipClient>
173 -  
174 - std::vector< DeviceInfo > m_vec_device; 169 + std::map<std::string, DeviceInfo> m_device_map;
175 170
176 thread* m_event_loop_thread; 171 thread* m_event_loop_thread;
177 }; 172 };