Blame view

sip/WebSocketServer.cpp 7.18 KB
c887a0f0   Hu Chunming   提交初成版代码
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
  #include <iostream>
  
  #include "WebSocketServer.h"
  #include "./Utils/StringTools.hpp"
  #include "ConfigParser.hpp"
  #include "./Utils/logger.hpp"
  
  using websocketpp::lib::placeholders::_1;
  using websocketpp::lib::placeholders::_2;
  using websocketpp::lib::bind;
  
  
  WebSocketServer::WebSocketServer(/* args */)
  {
  }
  
  WebSocketServer::~WebSocketServer()
  {
  }
  
  int WebSocketServer::parse_invite(vector<string>& vec_msg, std::string ip) {
      string net_type = "";
      if (StringTools::to_lower(vec_msg[1]) == "udp") {
          net_type = "udp";
      } else if (StringTools::to_lower(vec_msg[1]) == "tcp") {
          net_type = "tcp";
      }
4efb6240   Hu Chunming   call release 自动重新...
28
29
  
      LOG_INFO("invite {}:{}    net type: {}", vec_msg[2], vec_msg[3], vec_msg[1]);
c887a0f0   Hu Chunming   提交初成版代码
30
31
32
      int ret = -100;
      if ("udp" == net_type) {
          ret = sip_server.RequestInvite_UDP(vec_msg[2].c_str(), ip.c_str(), atoi(vec_msg[3].c_str()));
3a5bc7be   Hu Chunming   添加无鉴权;支持摄像头直连
33
      } else if ("tcp" == net_type)  {
2a17578f   Hu Chunming   添加tcp_p支持;
34
          ret = sip_server.RequestInvite_TCP_p(vec_msg[2].c_str(), ip.c_str(), atoi(vec_msg[3].c_str()));
c887a0f0   Hu Chunming   提交初成版代码
35
36
37
38
39
40
41
42
43
44
      }
  
      return ret;
  }
  
  string WebSocketServer::get_ip_from_hdl(websocketpp::connection_hdl hdl) {
      server::connection_ptr con = ws_server.get_con_from_hdl(hdl);
      // 获取客户端IP地址
      auto addr = con->get_socket().remote_endpoint().address().to_string();
      std::string ip = addr.substr(addr.find_last_of(":")+1);
4efb6240   Hu Chunming   call release 自动重新...
45
      LOG_DEBUG("ip:{}", ip);
c887a0f0   Hu Chunming   提交初成版代码
46
47
48
49
50
51
52
53
54
55
56
      return ip;
  }
  
  int WebSocketServer::msg_parser(websocketpp::connection_hdl hdl, string msg) {
      vector<string> vec_msg = StringTools::split(msg, "|");
      if (vec_msg.size() <= 0)  {
          return -1;
      }
  
      string ip = get_ip_from_hdl(hdl);
  
2a17578f   Hu Chunming   添加tcp_p支持;
57
58
      auto task_key = std::make_tuple(vec_msg[2], ip, atoi(vec_msg[3].c_str()));
  
10821ac3   Hu Chunming   1.定时刷新设备目录;
59
      string response_msg = "";
c887a0f0   Hu Chunming   提交初成版代码
60
61
62
      int ret = -100;
      if ( StringTools::to_lower(vec_msg[0]) == "invite") {
          ret = parse_invite(vec_msg, ip);
4efb6240   Hu Chunming   call release 自动重新...
63
64
65
66
          string strKey = vec_msg[2] + "_" + vec_msg[3];
          if (ret > 0) {
              std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx);
              m_channelport_hdl_map[strKey] = hdl;
2a17578f   Hu Chunming   添加tcp_p支持;
67
68
69
70
  
              std::lock_guard<std::mutex> l_task(m_hdl_task_mtx);
              auto conn = ws_server.get_con_from_hdl(hdl);
              m_hdl_task.emplace(conn, task_key);
4efb6240   Hu Chunming   call release 自动重新...
71
72
73
          }
          
          response_msg = strKey +"|" + vec_msg[0] + "|" + vec_msg[1] + "|" + to_string(ret);
10821ac3   Hu Chunming   1.定时刷新设备目录;
74
          ws_server.send(hdl, response_msg, websocketpp::frame::opcode::text);
c887a0f0   Hu Chunming   提交初成版代码
75
76
      } else if ( StringTools::to_lower(vec_msg[0]) == "bye") {
          if (StringTools::to_lower(vec_msg[1]) == "invite") {
4efb6240   Hu Chunming   call release 自动重新...
77
78
79
80
81
82
83
84
85
              LOG_INFO("BYE invite: {}", vec_msg[2]);
              
              std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx);
              string strKey = vec_msg[2] + "_" + vec_msg[3];
              auto it = m_channelport_hdl_map.find(strKey);
              if (it != m_channelport_hdl_map.end()) {
                  m_channelport_hdl_map.erase(it);
              }
  
c887a0f0   Hu Chunming   提交初成版代码
86
              ret = sip_server.ByeInvite(vec_msg[2], ip, atoi(vec_msg[3].c_str()));
2a17578f   Hu Chunming   添加tcp_p支持;
87
88
89
90
91
92
93
94
95
              if (ret == 0) {
                  std::lock_guard<std::mutex> l_task(m_hdl_task_mtx);
                  for(auto it_task = m_hdl_task.begin(); it_task != m_hdl_task.end(); it_task++) {
                      if(it_task->second == task_key) {
                          m_hdl_task.erase(it_task);
                          break;
                      }
                  }
              }
c887a0f0   Hu Chunming   提交初成版代码
96
97
          }
      } else {
4efb6240   Hu Chunming   call release 自动重新...
98
          LOG_ERROR("on_message called with hdl: {}  and message:{}", hdl.lock().get(), msg);
c887a0f0   Hu Chunming   提交初成版代码
99
100
101
102
103
      }
  
      return ret;
  }
  
4efb6240   Hu Chunming   call release 自动重新...
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
  void WebSocketServer::response_client(std::string sip_channel_id, int rtp_port, std::string net_type, int ret) {
  
      std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx);
  
      string strKey = sip_channel_id + "_" + to_string(rtp_port);
      auto it = m_channelport_hdl_map.find(strKey);
      if (it == m_channelport_hdl_map.end()) {
          return;
      }
  
      try {
          // invite
          string response_msg = strKey +"|invite|" + net_type + "|" + to_string(ret);
          ws_server.send(it->second, response_msg, websocketpp::frame::opcode::text);
      } catch(const std::exception& e) {
          // 存在一种可能:连接已经断开,但是sip那边请求失败,这种时候应该是会抛出异常。所以这里用try-cache,屏蔽此情况造成的问题
          LOG_WARN("response failed because::{}", e.what());
      }
  }
  
c887a0f0   Hu Chunming   提交初成版代码
124
125
126
127
128
129
130
131
132
  // Define a callback to handle incoming messages
  void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr msg) {
  
      if (msg->get_payload() == "stop-listening") {
          ws_server.stop_listening();
          return;
      }
  
      try {
4efb6240   Hu Chunming   call release 自动重新...
133
          msg_parser(hdl,msg->get_payload());
c887a0f0   Hu Chunming   提交初成版代码
134
      } catch (websocketpp::exception const & e) {
4efb6240   Hu Chunming   call release 自动重新...
135
          LOG_ERROR("Echo failed because::{}", e.what());
c887a0f0   Hu Chunming   提交初成版代码
136
137
138
139
140
141
          ws_server.send(hdl, to_string(-101), websocketpp::frame::opcode::text);
      }
  }
  
  void WebSocketServer::on_open(websocketpp::connection_hdl hdl)
  {
4efb6240   Hu Chunming   call release 自动重新...
142
      LOG_INFO("连接sip服务器成功!");
c887a0f0   Hu Chunming   提交初成版代码
143
144
145
  }
  
  void WebSocketServer::on_fail(websocketpp::connection_hdl h){
4efb6240   Hu Chunming   call release 自动重新...
146
      LOG_WARN("连接sip服务器失败!");
c887a0f0   Hu Chunming   提交初成版代码
147
148
149
  }
  
  void WebSocketServer::on_close(websocketpp::connection_hdl h){
4efb6240   Hu Chunming   call release 自动重新...
150
151
152
153
      LOG_INFO("on_close:{}", h.lock().get());
  
      std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx);
  
2a17578f   Hu Chunming   添加tcp_p支持;
154
      server::connection_ptr con_std = ws_server.get_con_from_hdl(h);
4efb6240   Hu Chunming   call release 自动重新...
155
156
157
      for (auto it = m_channelport_hdl_map.begin(); it != m_channelport_hdl_map.end(); )
      {
          server::connection_ptr con = ws_server.get_con_from_hdl(it->second);
2a17578f   Hu Chunming   添加tcp_p支持;
158
          
4efb6240   Hu Chunming   call release 自动重新...
159
160
161
162
163
164
          if (con == con_std) {
              it = m_channelport_hdl_map.erase(it);
          } else {
              it++;
          }
      }
2a17578f   Hu Chunming   添加tcp_p支持;
165
166
167
168
169
170
171
172
173
174
  
      std::lock_guard<std::mutex> l_task(m_hdl_task_mtx);
      for(auto it_task = m_hdl_task.begin(); it_task != m_hdl_task.end(); ) {
          if(it_task->first == con_std) {
              sip_server.RemoveInviteTask(it_task->second);
              it_task = m_hdl_task.erase(it_task);
          } else {
              it_task++ ;
          }
      }
c887a0f0   Hu Chunming   提交初成版代码
175
176
177
178
179
180
181
182
183
184
185
186
187
  }
  
  
  void WebSocketServer::start() {
      ConfigParser* pConfig = ConfigParser::getInstance();
      if (!pConfig->init())
      {
          LOG_ERROR("get config failed!");
          return;
      }
  
      ServerInfo info = pConfig->getServerCfg();
      
4efb6240   Hu Chunming   call release 自动重新...
188
      sip_server.Init(&info, this);
c887a0f0   Hu Chunming   提交初成版代码
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
  
      try {
          // Set logging settings
          ws_server.set_access_channels(websocketpp::log::alevel::all);
          ws_server.clear_access_channels(websocketpp::log::alevel::frame_payload);
  
          // Initialize Asio
          ws_server.init_asio();
  
          // Register our message handler
          ws_server.set_message_handler(bind(&WebSocketServer::on_message,this,::_1,::_2));
          ws_server.set_open_handler(bind(&WebSocketServer::on_open, this, _1));
          ws_server.set_fail_handler(bind(&WebSocketServer::on_fail, this, _1));
          ws_server.set_close_handler(bind(&WebSocketServer::on_close, this, _1));
  
          // Listen on port 9002
          int port = info.getWsPort();
4efb6240   Hu Chunming   call release 自动重新...
206
          LOG_INFO("websocket server listen:{}", port);
c887a0f0   Hu Chunming   提交初成版代码
207
208
209
210
211
212
213
214
          ws_server.listen(port);
  
          // Start the server accept loop
          ws_server.start_accept();
  
          // Start the ASIO io_service run loop
          ws_server.run();
      } catch (websocketpp::exception const & e) {
4efb6240   Hu Chunming   call release 自动重新...
215
          LOG_ERROR("websocket start failed:{}", e.what());
c887a0f0   Hu Chunming   提交初成版代码
216
      } catch (...) {
4efb6240   Hu Chunming   call release 自动重新...
217
          LOG_ERROR("websocket start failed: other exception");
c887a0f0   Hu Chunming   提交初成版代码
218
219
      }
  }