Commit 4efb624075ee655666e2bf6177a5ac6fba3f921c
1 parent
e918c2a7
call release 自动重新invite 补交
Showing
2 changed files
with
75 additions
and
26 deletions
sip/WebSocketServer.cpp
@@ -25,13 +25,11 @@ int WebSocketServer::parse_invite(vector<string>& vec_msg, std::string ip) { | @@ -25,13 +25,11 @@ int WebSocketServer::parse_invite(vector<string>& vec_msg, std::string ip) { | ||
25 | } else if (StringTools::to_lower(vec_msg[1]) == "tcp") { | 25 | } else if (StringTools::to_lower(vec_msg[1]) == "tcp") { |
26 | net_type = "tcp"; | 26 | net_type = "tcp"; |
27 | } | 27 | } |
28 | - std::cout << "net type: " << vec_msg[1] << std::endl; | ||
29 | - | ||
30 | - std::cout << "invite " << vec_msg[2] << ":" << vec_msg[3] << std::endl; | 28 | + |
29 | + LOG_INFO("invite {}:{} net type: {}", vec_msg[2], vec_msg[3], vec_msg[1]); | ||
31 | int ret = -100; | 30 | int ret = -100; |
32 | if ("udp" == net_type) { | 31 | if ("udp" == net_type) { |
33 | ret = sip_server.RequestInvite_UDP(vec_msg[2].c_str(), ip.c_str(), atoi(vec_msg[3].c_str())); | 32 | ret = sip_server.RequestInvite_UDP(vec_msg[2].c_str(), ip.c_str(), atoi(vec_msg[3].c_str())); |
34 | - // ret = sip_server.RequestInvite_UDP(vec_data[0].c_str(), "176.10.0.3", 30026); | ||
35 | } else if ("tcp" == net_type) | 33 | } else if ("tcp" == net_type) |
36 | { | 34 | { |
37 | /* code */ | 35 | /* code */ |
@@ -45,7 +43,7 @@ string WebSocketServer::get_ip_from_hdl(websocketpp::connection_hdl hdl) { | @@ -45,7 +43,7 @@ string WebSocketServer::get_ip_from_hdl(websocketpp::connection_hdl hdl) { | ||
45 | // 获取客户端IP地址 | 43 | // 获取客户端IP地址 |
46 | auto addr = con->get_socket().remote_endpoint().address().to_string(); | 44 | auto addr = con->get_socket().remote_endpoint().address().to_string(); |
47 | std::string ip = addr.substr(addr.find_last_of(":")+1); | 45 | std::string ip = addr.substr(addr.find_last_of(":")+1); |
48 | - std::cout << "ip:" << ip << endl; | 46 | + LOG_DEBUG("ip:{}", ip); |
49 | return ip; | 47 | return ip; |
50 | } | 48 | } |
51 | 49 | ||
@@ -58,26 +56,57 @@ int WebSocketServer::msg_parser(websocketpp::connection_hdl hdl, string msg) { | @@ -58,26 +56,57 @@ int WebSocketServer::msg_parser(websocketpp::connection_hdl hdl, string msg) { | ||
58 | string ip = get_ip_from_hdl(hdl); | 56 | string ip = get_ip_from_hdl(hdl); |
59 | 57 | ||
60 | string response_msg = ""; | 58 | string response_msg = ""; |
61 | - | ||
62 | int ret = -100; | 59 | int ret = -100; |
63 | if ( StringTools::to_lower(vec_msg[0]) == "invite") { | 60 | if ( StringTools::to_lower(vec_msg[0]) == "invite") { |
64 | ret = parse_invite(vec_msg, ip); | 61 | ret = parse_invite(vec_msg, ip); |
65 | - response_msg = vec_msg[2] + "_" + vec_msg[3] +"|" + vec_msg[0] + "|" + vec_msg[1] + "|" + to_string(ret); | 62 | + string strKey = vec_msg[2] + "_" + vec_msg[3]; |
63 | + if (ret > 0) { | ||
64 | + std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx); | ||
65 | + m_channelport_hdl_map[strKey] = hdl; | ||
66 | + } | ||
67 | + | ||
68 | + response_msg = strKey +"|" + vec_msg[0] + "|" + vec_msg[1] + "|" + to_string(ret); | ||
66 | ws_server.send(hdl, response_msg, websocketpp::frame::opcode::text); | 69 | ws_server.send(hdl, response_msg, websocketpp::frame::opcode::text); |
67 | } else if ( StringTools::to_lower(vec_msg[0]) == "bye") { | 70 | } else if ( StringTools::to_lower(vec_msg[0]) == "bye") { |
68 | if (StringTools::to_lower(vec_msg[1]) == "invite") { | 71 | if (StringTools::to_lower(vec_msg[1]) == "invite") { |
69 | - std::cout << "bye invite: " << vec_msg[2] << std::endl; | 72 | + LOG_INFO("BYE invite: {}", vec_msg[2]); |
73 | + | ||
74 | + std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx); | ||
75 | + string strKey = vec_msg[2] + "_" + vec_msg[3]; | ||
76 | + auto it = m_channelport_hdl_map.find(strKey); | ||
77 | + if (it != m_channelport_hdl_map.end()) { | ||
78 | + m_channelport_hdl_map.erase(it); | ||
79 | + } | ||
80 | + | ||
70 | ret = sip_server.ByeInvite(vec_msg[2], ip, atoi(vec_msg[3].c_str())); | 81 | ret = sip_server.ByeInvite(vec_msg[2], ip, atoi(vec_msg[3].c_str())); |
71 | } | 82 | } |
72 | } else { | 83 | } else { |
73 | - std::cout << "on_message called with hdl: " << hdl.lock().get() | ||
74 | - << " and message: " << msg | ||
75 | - << std::endl; | 84 | + LOG_ERROR("on_message called with hdl: {} and message:{}", hdl.lock().get(), msg); |
76 | } | 85 | } |
77 | 86 | ||
78 | return ret; | 87 | return ret; |
79 | } | 88 | } |
80 | 89 | ||
90 | +void WebSocketServer::response_client(std::string sip_channel_id, int rtp_port, std::string net_type, int ret) { | ||
91 | + | ||
92 | + std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx); | ||
93 | + | ||
94 | + string strKey = sip_channel_id + "_" + to_string(rtp_port); | ||
95 | + auto it = m_channelport_hdl_map.find(strKey); | ||
96 | + if (it == m_channelport_hdl_map.end()) { | ||
97 | + return; | ||
98 | + } | ||
99 | + | ||
100 | + try { | ||
101 | + // invite | ||
102 | + string response_msg = strKey +"|invite|" + net_type + "|" + to_string(ret); | ||
103 | + ws_server.send(it->second, response_msg, websocketpp::frame::opcode::text); | ||
104 | + } catch(const std::exception& e) { | ||
105 | + // 存在一种可能:连接已经断开,但是sip那边请求失败,这种时候应该是会抛出异常。所以这里用try-cache,屏蔽此情况造成的问题 | ||
106 | + LOG_WARN("response failed because::{}", e.what()); | ||
107 | + } | ||
108 | +} | ||
109 | + | ||
81 | // Define a callback to handle incoming messages | 110 | // Define a callback to handle incoming messages |
82 | void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr msg) { | 111 | void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr msg) { |
83 | 112 | ||
@@ -87,29 +116,37 @@ void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr ms | @@ -87,29 +116,37 @@ void WebSocketServer::on_message(websocketpp::connection_hdl hdl, message_ptr ms | ||
87 | } | 116 | } |
88 | 117 | ||
89 | try { | 118 | try { |
90 | - int ret = msg_parser(hdl,msg->get_payload()); | ||
91 | - // 返回执行结果 | ||
92 | - // ws_server.send(hdl, to_string(ret), websocketpp::frame::opcode::text); | 119 | + msg_parser(hdl,msg->get_payload()); |
93 | } catch (websocketpp::exception const & e) { | 120 | } catch (websocketpp::exception const & e) { |
94 | - std::cout << "Echo failed because: " << "(" << e.what() << ")" << std::endl; | 121 | + LOG_ERROR("Echo failed because::{}", e.what()); |
95 | ws_server.send(hdl, to_string(-101), websocketpp::frame::opcode::text); | 122 | ws_server.send(hdl, to_string(-101), websocketpp::frame::opcode::text); |
96 | } | 123 | } |
97 | } | 124 | } |
98 | 125 | ||
99 | void WebSocketServer::on_open(websocketpp::connection_hdl hdl) | 126 | void WebSocketServer::on_open(websocketpp::connection_hdl hdl) |
100 | { | 127 | { |
101 | - // std::string msg = "hello"; | ||
102 | - // c.send(hdl, msg, websocketpp::frame::opcode::text); | ||
103 | - // c.get_alog().write(websocketpp::log::alevel::app, "Tx: " + msg); | ||
104 | - std::cout << "连接sip服务器成功!" << std::endl; | 128 | + LOG_INFO("连接sip服务器成功!"); |
105 | } | 129 | } |
106 | 130 | ||
107 | void WebSocketServer::on_fail(websocketpp::connection_hdl h){ | 131 | void WebSocketServer::on_fail(websocketpp::connection_hdl h){ |
108 | - std::cout << "连接sip服务器失败!" << std::endl; | 132 | + LOG_WARN("连接sip服务器失败!"); |
109 | } | 133 | } |
110 | 134 | ||
111 | void WebSocketServer::on_close(websocketpp::connection_hdl h){ | 135 | void WebSocketServer::on_close(websocketpp::connection_hdl h){ |
112 | - std::cout << "on_close" << std::endl; | 136 | + LOG_INFO("on_close:{}", h.lock().get()); |
137 | + | ||
138 | + std::lock_guard<std::mutex> l_hdl(m_channelport_hdl_map_mtx); | ||
139 | + | ||
140 | + for (auto it = m_channelport_hdl_map.begin(); it != m_channelport_hdl_map.end(); ) | ||
141 | + { | ||
142 | + server::connection_ptr con = ws_server.get_con_from_hdl(it->second); | ||
143 | + server::connection_ptr con_std = ws_server.get_con_from_hdl(h); | ||
144 | + if (con == con_std) { | ||
145 | + it = m_channelport_hdl_map.erase(it); | ||
146 | + } else { | ||
147 | + it++; | ||
148 | + } | ||
149 | + } | ||
113 | } | 150 | } |
114 | 151 | ||
115 | 152 | ||
@@ -123,7 +160,7 @@ void WebSocketServer::start() { | @@ -123,7 +160,7 @@ void WebSocketServer::start() { | ||
123 | 160 | ||
124 | ServerInfo info = pConfig->getServerCfg(); | 161 | ServerInfo info = pConfig->getServerCfg(); |
125 | 162 | ||
126 | - sip_server.Init(&info); | 163 | + sip_server.Init(&info, this); |
127 | 164 | ||
128 | try { | 165 | try { |
129 | // Set logging settings | 166 | // Set logging settings |
@@ -141,7 +178,7 @@ void WebSocketServer::start() { | @@ -141,7 +178,7 @@ void WebSocketServer::start() { | ||
141 | 178 | ||
142 | // Listen on port 9002 | 179 | // Listen on port 9002 |
143 | int port = info.getWsPort(); | 180 | int port = info.getWsPort(); |
144 | - std::cout << "websocket server listen:" << port << std::endl; | 181 | + LOG_INFO("websocket server listen:{}", port); |
145 | ws_server.listen(port); | 182 | ws_server.listen(port); |
146 | 183 | ||
147 | // Start the server accept loop | 184 | // Start the server accept loop |
@@ -150,8 +187,8 @@ void WebSocketServer::start() { | @@ -150,8 +187,8 @@ void WebSocketServer::start() { | ||
150 | // Start the ASIO io_service run loop | 187 | // Start the ASIO io_service run loop |
151 | ws_server.run(); | 188 | ws_server.run(); |
152 | } catch (websocketpp::exception const & e) { | 189 | } catch (websocketpp::exception const & e) { |
153 | - std::cout << e.what() << std::endl; | 190 | + LOG_ERROR("websocket start failed:{}", e.what()); |
154 | } catch (...) { | 191 | } catch (...) { |
155 | - std::cout << "other exception" << std::endl; | 192 | + LOG_ERROR("websocket start failed: other exception"); |
156 | } | 193 | } |
157 | } | 194 | } |
sip/WebSocketServer.h
1 | +#ifndef __WEB_SOCKET_SERVER__ | ||
2 | +#define __WEB_SOCKET_SERVER__ | ||
3 | + | ||
1 | #include <websocketpp/config/asio_no_tls.hpp> | 4 | #include <websocketpp/config/asio_no_tls.hpp> |
2 | #include <websocketpp/server.hpp> | 5 | #include <websocketpp/server.hpp> |
3 | 6 | ||
4 | #include "SipServer.h" | 7 | #include "SipServer.h" |
8 | +#include <map> | ||
9 | +#include <mutex> | ||
5 | 10 | ||
6 | typedef websocketpp::server<websocketpp::config::asio> server; | 11 | typedef websocketpp::server<websocketpp::config::asio> server; |
7 | 12 | ||
@@ -24,6 +29,8 @@ public: | @@ -24,6 +29,8 @@ public: | ||
24 | 29 | ||
25 | void start(); | 30 | void start(); |
26 | 31 | ||
32 | + void response_client(std::string sip_channel_id, int rtp_port, std::string net_type, int ret); | ||
33 | + | ||
27 | private: | 34 | private: |
28 | int msg_parser(websocketpp::connection_hdl hdl, string msg); | 35 | int msg_parser(websocketpp::connection_hdl hdl, string msg); |
29 | int parse_invite(vector<string>& vec_msg, std::string ip); | 36 | int parse_invite(vector<string>& vec_msg, std::string ip); |
@@ -33,4 +40,9 @@ private: | @@ -33,4 +40,9 @@ private: | ||
33 | private: | 40 | private: |
34 | server ws_server; | 41 | server ws_server; |
35 | SipServer sip_server; | 42 | SipServer sip_server; |
36 | -}; | ||
37 | \ No newline at end of file | 43 | \ No newline at end of file |
44 | + | ||
45 | + std::map<string, websocketpp::connection_hdl> m_channelport_hdl_map; | ||
46 | + std::mutex m_channelport_hdl_map_mtx; | ||
47 | +}; | ||
48 | + | ||
49 | +#endif // __WEB_SOCKET_SERVER__ | ||
38 | \ No newline at end of file | 50 | \ No newline at end of file |