winlin

fix #147, support identify the srs edge. 0.9.190.

@@ -208,6 +208,7 @@ Supported operating systems and hardware: @@ -208,6 +208,7 @@ Supported operating systems and hardware:
208 * 2013-10-17, Created.<br/> 208 * 2013-10-17, Created.<br/>
209 209
210 ## History 210 ## History
  211 +* v1.0, 2014-08-06, fix [#147](https://github.com/winlinvip/simple-rtmp-server/issues/147), support identify the srs edge. 0.9.190.
211 * <strong>v1.0, 2014-08-03, [1.0 mainline7(0.9.189)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline7) released. 57432 lines.</strong> 212 * <strong>v1.0, 2014-08-03, [1.0 mainline7(0.9.189)](https://github.com/winlinvip/simple-rtmp-server/releases/tag/1.0.mainline7) released. 57432 lines.</strong>
212 * v1.0, 2014-08-03, fix [#79](https://github.com/winlinvip/simple-rtmp-server/issues/79), fix the reload remove edge assert bug. 0.9.189. 213 * v1.0, 2014-08-03, fix [#79](https://github.com/winlinvip/simple-rtmp-server/issues/79), fix the reload remove edge assert bug. 0.9.189.
213 * v1.0, 2014-08-03, fix [#57](https://github.com/winlinvip/simple-rtmp-server/issues/57), use lock(acquire/release publish) to avoid duplicated publishing. 0.9.188. 214 * v1.0, 2014-08-03, fix [#57](https://github.com/winlinvip/simple-rtmp-server/issues/57), use lock(acquire/release publish) to avoid duplicated publishing. 0.9.188.
@@ -46,6 +46,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -46,6 +46,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
46 #include <srs_kernel_utility.hpp> 46 #include <srs_kernel_utility.hpp>
47 #include <srs_protocol_msg_array.hpp> 47 #include <srs_protocol_msg_array.hpp>
48 #include <srs_app_utility.hpp> 48 #include <srs_app_utility.hpp>
  49 +#include <srs_protocol_amf0.hpp>
49 50
50 // when error, edge ingester sleep for a while and retry. 51 // when error, edge ingester sleep for a while and retry.
51 #define SRS_EDGE_INGESTER_SLEEP_US (int64_t)(1*1000*1000LL) 52 #define SRS_EDGE_INGESTER_SLEEP_US (int64_t)(1*1000*1000LL)
@@ -131,8 +132,7 @@ int SrsEdgeIngester::cycle() @@ -131,8 +132,7 @@ int SrsEdgeIngester::cycle()
131 srs_error("handshake with server failed. ret=%d", ret); 132 srs_error("handshake with server failed. ret=%d", ret);
132 return ret; 133 return ret;
133 } 134 }
134 - if ((ret = client->connect_app(req->app, req->tcUrl, req)) != ERROR_SUCCESS) {  
135 - srs_error("connect with server failed, tcUrl=%s. ret=%d", req->tcUrl.c_str(), ret); 135 + if ((ret = connect_app()) != ERROR_SUCCESS) {
136 return ret; 136 return ret;
137 } 137 }
138 if ((ret = client->create_stream(stream_id)) != ERROR_SUCCESS) { 138 if ((ret = client->create_stream(stream_id)) != ERROR_SUCCESS) {
@@ -209,6 +209,49 @@ int SrsEdgeIngester::ingest() @@ -209,6 +209,49 @@ int SrsEdgeIngester::ingest()
209 return ret; 209 return ret;
210 } 210 }
211 211
  212 +int SrsEdgeIngester::connect_app()
  213 +{
  214 + int ret = ERROR_SUCCESS;
  215 +
  216 + SrsRequest* req = _req;
  217 +
  218 + // args of request takes the srs info.
  219 + if (req->args == NULL) {
  220 + req->args = SrsAmf0Any::object();
  221 + }
  222 +
  223 + // notify server the edge identity,
  224 + // @see https://github.com/winlinvip/simple-rtmp-server/issues/147
  225 + SrsAmf0Object* data = req->args;
  226 + data->set("srs_sig", SrsAmf0Any::str(RTMP_SIG_SRS_KEY));
  227 + data->set("srs_server", SrsAmf0Any::str(RTMP_SIG_SRS_KEY" "RTMP_SIG_SRS_VERSION" ("RTMP_SIG_SRS_URL_SHORT")"));
  228 + data->set("srs_license", SrsAmf0Any::str(RTMP_SIG_SRS_LICENSE));
  229 + data->set("srs_role", SrsAmf0Any::str(RTMP_SIG_SRS_ROLE));
  230 + data->set("srs_url", SrsAmf0Any::str(RTMP_SIG_SRS_URL));
  231 + data->set("srs_version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION));
  232 + data->set("srs_site", SrsAmf0Any::str(RTMP_SIG_SRS_WEB));
  233 + data->set("srs_email", SrsAmf0Any::str(RTMP_SIG_SRS_EMAIL));
  234 + data->set("srs_copyright", SrsAmf0Any::str(RTMP_SIG_SRS_COPYRIGHT));
  235 + data->set("srs_primary_authors", SrsAmf0Any::str(RTMP_SIG_SRS_PRIMARY_AUTHROS));
  236 + // for edge to directly get the id of client.
  237 + data->set("srs_pid", SrsAmf0Any::number(getpid()));
  238 + data->set("srs_id", SrsAmf0Any::number(_srs_context->get_id()));
  239 +
  240 + // local ip of edge
  241 + std::vector<std::string> ips = srs_get_local_ipv4_ips();
  242 + assert(_srs_config->get_stats_network() < (int)ips.size());
  243 + std::string local_ip = ips[_srs_config->get_stats_network()];
  244 + data->set("srs_server_ip", SrsAmf0Any::str(local_ip.c_str()));
  245 +
  246 + // upnode server identity will show in the connect_app of client.
  247 + if ((ret = client->connect_app(req->app, req->tcUrl, req)) != ERROR_SUCCESS) {
  248 + srs_error("connect with server failed, tcUrl=%s. ret=%d", req->tcUrl.c_str(), ret);
  249 + return ret;
  250 + }
  251 +
  252 + return ret;
  253 +}
  254 +
212 int SrsEdgeIngester::process_publish_message(SrsMessage* msg) 255 int SrsEdgeIngester::process_publish_message(SrsMessage* msg)
213 { 256 {
214 int ret = ERROR_SUCCESS; 257 int ret = ERROR_SUCCESS;
@@ -101,6 +101,7 @@ private: @@ -101,6 +101,7 @@ private:
101 virtual int ingest(); 101 virtual int ingest();
102 virtual void close_underlayer_socket(); 102 virtual void close_underlayer_socket();
103 virtual int connect_server(); 103 virtual int connect_server();
  104 + virtual int connect_app();
104 virtual int process_publish_message(SrsMessage* msg); 105 virtual int process_publish_message(SrsMessage* msg);
105 }; 106 };
106 107
@@ -163,6 +163,35 @@ int SrsRtmpConn::do_cycle() @@ -163,6 +163,35 @@ int SrsRtmpConn::do_cycle()
163 req->schema.c_str(), req->vhost.c_str(), req->port.c_str(), 163 req->schema.c_str(), req->vhost.c_str(), req->port.c_str(),
164 req->app.c_str(), (req->args? "(obj)":"null")); 164 req->app.c_str(), (req->args? "(obj)":"null"));
165 165
  166 + // show client identity
  167 + if(req->args) {
  168 + std::string srs_version;
  169 + std::string srs_server_ip;
  170 + int srs_pid = 0;
  171 + int srs_id = 0;
  172 +
  173 + SrsAmf0Any* prop = NULL;
  174 + if ((prop = req->args->ensure_property_string("srs_version")) != NULL) {
  175 + srs_version = prop->to_str();
  176 + }
  177 + if ((prop = req->args->ensure_property_string("srs_server_ip")) != NULL) {
  178 + srs_server_ip = prop->to_str();
  179 + }
  180 + if ((prop = req->args->ensure_property_number("srs_pid")) != NULL) {
  181 + srs_pid = (int)prop->to_number();
  182 + }
  183 + if ((prop = req->args->ensure_property_number("srs_id")) != NULL) {
  184 + srs_id = (int)prop->to_number();
  185 + }
  186 +
  187 + srs_info("edge-srs ip=%s, version=%s, pid=%d, id=%d",
  188 + srs_server_ip.c_str(), srs_version.c_str(), srs_pid, srs_id);
  189 + if (srs_pid > 0) {
  190 + srs_trace("edge-srs ip=%s, version=%s, pid=%d, id=%d",
  191 + srs_server_ip.c_str(), srs_version.c_str(), srs_pid, srs_id);
  192 + }
  193 + }
  194 +
166 ret = service_cycle(); 195 ret = service_cycle();
167 http_hooks_on_close(); 196 http_hooks_on_close();
168 197
@@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. @@ -31,7 +31,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
31 // current release version 31 // current release version
32 #define VERSION_MAJOR "0" 32 #define VERSION_MAJOR "0"
33 #define VERSION_MINOR "9" 33 #define VERSION_MINOR "9"
34 -#define VERSION_REVISION "189" 34 +#define VERSION_REVISION "190"
35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION 35 #define RTMP_SIG_SRS_VERSION VERSION_MAJOR"."VERSION_MINOR"."VERSION_REVISION
36 // server info. 36 // server info.
37 #define RTMP_SIG_SRS_KEY "SRS" 37 #define RTMP_SIG_SRS_KEY "SRS"