diff --git a/trunk/src/app/srs_app_heartbeat.cpp b/trunk/src/app/srs_app_heartbeat.cpp index 1d3e7fe48..95a17e971 100644 --- a/trunk/src/app/srs_app_heartbeat.cpp +++ b/trunk/src/app/srs_app_heartbeat.cpp @@ -36,6 +36,7 @@ using namespace std; #include #include #include +#include SrsHttpHeartbeat::SrsHttpHeartbeat() { @@ -65,23 +66,25 @@ void SrsHttpHeartbeat::heartbeat() ip = ips[_srs_config->get_stats_network() % (int)ips.size()]; } - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("device_id", device_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", ip); + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("device_id", SrsAmf0Any::str(device_id.c_str())); + obj->set("ip", SrsAmf0Any::str(ip.c_str())); + if (_srs_config->get_heartbeat_summaries()) { - ss << SRS_JFIELD_CONT << SRS_JFIELD_ORG("summaries", ""); - srs_api_dump_summaries(ss); + SrsAmf0Object* summaries = SrsAmf0Any::object(); + obj->set("summaries", summaries); + + srs_api_dump_summaries(summaries); } - ss << SRS_JOBJECT_END; - - std::string req = ss.str(); SrsHttpClient http; if ((ret = http.initialize(uri.get_host(), uri.get_port())) != ERROR_SUCCESS) { return; } + std::string req = obj->to_json(); ISrsHttpMessage* msg = NULL; if ((ret = http.post(uri.get_path(), req, &msg)) != ERROR_SUCCESS) { srs_info("http post hartbeart uri failed. url=%s, request=%s, ret=%d", diff --git a/trunk/src/app/srs_app_http_api.cpp b/trunk/src/app/srs_app_http_api.cpp index c39d4b4c7..d3549a646 100755 --- a/trunk/src/app/srs_app_http_api.cpp +++ b/trunk/src/app/srs_app_http_api.cpp @@ -267,9 +267,12 @@ SrsGoApiSummaries::~SrsGoApiSummaries() int SrsGoApiSummaries::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) { - std::stringstream ss; - srs_api_dump_summaries(ss); - return srs_api_response(w, r, ss.str()); + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + srs_api_dump_summaries(obj); + + return srs_api_response(w, r, obj->to_json()); } SrsGoApiRusages::SrsGoApiRusages() @@ -295,7 +298,7 @@ int SrsGoApiRusages::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) SrsRusage* ru = srs_get_system_rusage(); - data->set("ok", SrsAmf0Any::boolean(ru->ok? "true":"false")); + data->set("ok", SrsAmf0Any::boolean(ru->ok)); data->set("sample_time", SrsAmf0Any::number(ru->sample_time)); data->set("ru_utime", SrsAmf0Any::number(ru->r.ru_utime.tv_sec)); data->set("ru_stime", SrsAmf0Any::number(ru->r.ru_stime.tv_sec)); @@ -343,7 +346,7 @@ int SrsGoApiSelfProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage string state; state += (char)u->state; - data->set("ok", SrsAmf0Any::boolean(u->ok? "true":"false")); + data->set("ok", SrsAmf0Any::boolean(u->ok)); data->set("sample_time", SrsAmf0Any::number(u->sample_time)); data->set("percent", SrsAmf0Any::number(u->percent)); data->set("pid", SrsAmf0Any::number(u->pid)); @@ -417,7 +420,7 @@ int SrsGoApiSystemProcStats::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessa SrsProcSystemStat* s = srs_get_system_proc_stat(); - data->set("ok", SrsAmf0Any::boolean(s->ok? "true":"false")); + data->set("ok", SrsAmf0Any::boolean(s->ok)); data->set("sample_time", SrsAmf0Any::number(s->sample_time)); data->set("percent", SrsAmf0Any::number(s->percent)); data->set("user", SrsAmf0Any::number(s->user)); @@ -456,7 +459,7 @@ int SrsGoApiMemInfos::serve_http(ISrsHttpResponseWriter* w, ISrsHttpMessage* r) SrsMemInfo* m = srs_get_meminfo(); - data->set("ok", SrsAmf0Any::boolean(m->ok? "true":"false")); + data->set("ok", SrsAmf0Any::boolean(m->ok)); data->set("sample_time", SrsAmf0Any::number(m->sample_time)); data->set("percent_ram", SrsAmf0Any::number(m->percent_ram)); data->set("percent_swap", SrsAmf0Any::number(m->percent_swap)); diff --git a/trunk/src/app/srs_app_http_hooks.cpp b/trunk/src/app/srs_app_http_hooks.cpp index 3a361201d..9c65e0429 100644 --- a/trunk/src/app/srs_app_http_hooks.cpp +++ b/trunk/src/app/srs_app_http_hooks.cpp @@ -38,6 +38,7 @@ using namespace std; #include #include #include +#include #define SRS_HTTP_RESPONSE_OK SRS_XSTR(ERROR_SUCCESS) @@ -62,18 +63,18 @@ int SrsHttpHooks::on_connect(string url, SrsRequest* req) int client_id = _srs_context->get_id(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_connect") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("tcUrl", req->tcUrl) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("pageUrl", req->pageUrl) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_connect")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("tcUrl", SrsAmf0Any::str(req->tcUrl.c_str())); + obj->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str())); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -96,18 +97,18 @@ void SrsHttpHooks::on_close(string url, SrsRequest* req, int64_t send_bytes, int int client_id = _srs_context->get_id(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_close") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("send_bytes", send_bytes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("recv_bytes", recv_bytes) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_close")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("send_bytes", SrsAmf0Any::number(send_bytes)); + obj->set("recv_bytes", SrsAmf0Any::number(recv_bytes)); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -130,17 +131,17 @@ int SrsHttpHooks::on_publish(string url, SrsRequest* req) int client_id = _srs_context->get_id(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_publish") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("stream", req->stream) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_publish")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("stream", SrsAmf0Any::str(req->stream.c_str())); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -163,17 +164,17 @@ void SrsHttpHooks::on_unpublish(string url, SrsRequest* req) int client_id = _srs_context->get_id(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_unpublish") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("stream", req->stream) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_unpublish")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("stream", SrsAmf0Any::str(req->stream.c_str())); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -196,18 +197,18 @@ int SrsHttpHooks::on_play(string url, SrsRequest* req) int client_id = _srs_context->get_id(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_play") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("stream", req->stream) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("pageUrl", req->pageUrl) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_play")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("stream", SrsAmf0Any::str(req->stream.c_str())); + obj->set("pageUrl", SrsAmf0Any::str(req->pageUrl.c_str())); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -230,17 +231,17 @@ void SrsHttpHooks::on_stop(string url, SrsRequest* req) int client_id = _srs_context->get_id(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_stop") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("stream", req->stream) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_stop")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("stream", SrsAmf0Any::str(req->stream.c_str())); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -264,19 +265,19 @@ int SrsHttpHooks::on_dvr(string url, SrsRequest* req, string file) int client_id = _srs_context->get_id(); std::string cwd = _srs_config->cwd(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_dvr") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("stream", req->stream) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("cwd", cwd) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("file", file) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_dvr")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("stream", SrsAmf0Any::str(req->stream.c_str())); + obj->set("cwd", SrsAmf0Any::str(cwd.c_str())); + obj->set("file", SrsAmf0Any::str(file.c_str())); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { @@ -300,24 +301,24 @@ int SrsHttpHooks::on_hls(string url, SrsRequest* req, string file, string ts_url int client_id = _srs_context->get_id(); std::string cwd = _srs_config->cwd(); - std::stringstream ss; - ss << SRS_JOBJECT_START - << SRS_JFIELD_STR("action", "on_hls") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("client_id", client_id) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("ip", req->ip) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("vhost", req->vhost) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("app", req->app) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("stream", req->stream) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("duration", duration) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("cwd", cwd) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("file", file) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("url", ts_url) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("m3u8", m3u8) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("m3u8_url", m3u8_url) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("seq_no", sn) - << SRS_JOBJECT_END; + SrsAmf0Object* obj = SrsAmf0Any::object(); + SrsAutoFree(SrsAmf0Object, obj); + + obj->set("action", SrsAmf0Any::str("on_hls")); + obj->set("client_id", SrsAmf0Any::number(client_id)); + obj->set("ip", SrsAmf0Any::str(req->ip.c_str())); + obj->set("vhost", SrsAmf0Any::str(req->vhost.c_str())); + obj->set("app", SrsAmf0Any::str(req->app.c_str())); + obj->set("stream", SrsAmf0Any::str(req->stream.c_str())); + obj->set("duration", SrsAmf0Any::number(duration)); + obj->set("cwd", SrsAmf0Any::str(cwd.c_str())); + obj->set("file", SrsAmf0Any::str(file.c_str())); + obj->set("url", SrsAmf0Any::str(url.c_str())); + obj->set("m3u8", SrsAmf0Any::str(m3u8.c_str())); + obj->set("m3u8_url", SrsAmf0Any::str(m3u8_url.c_str())); + obj->set("seq_no", SrsAmf0Any::number(sn)); - std::string data = ss.str(); + std::string data = obj->to_json(); std::string res; int status_code; if ((ret = do_post(url, data, status_code, res)) != ERROR_SUCCESS) { diff --git a/trunk/src/app/srs_app_utility.cpp b/trunk/src/app/srs_app_utility.cpp index 39bf83ce4..fdd49de0b 100644 --- a/trunk/src/app/srs_app_utility.cpp +++ b/trunk/src/app/srs_app_utility.cpp @@ -45,6 +45,7 @@ using namespace std; #include #include #include +#include // the longest time to wait for a process to quit. #define SRS_PROCESS_QUIT_TIMEOUT_MS 1000 @@ -1354,7 +1355,7 @@ string srs_get_peer_ip(int fd) return ip; } -void srs_api_dump_summaries(std::stringstream& ss) +void srs_api_dump_summaries(SrsAmf0Object* obj) { SrsRusage* r = srs_get_system_rusage(); SrsProcSelfStat* u = srs_get_self_proc_stat(); @@ -1407,57 +1408,61 @@ void srs_api_dump_summaries(std::stringstream& ss) bool ok = (r->ok && u->ok && s->ok && c->ok && d->ok && m->ok && p->ok && nrs->ok); - ss << SRS_JOBJECT_START - << SRS_JFIELD_ERROR(ERROR_SUCCESS) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("data", SRS_JOBJECT_START) - << SRS_JFIELD_ORG("ok", (ok? "true":"false")) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("now_ms", now) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("self", SRS_JOBJECT_START) - << SRS_JFIELD_STR("version", RTMP_SIG_SRS_VERSION) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("pid", getpid()) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("ppid", u->ppid) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("argv", _srs_config->argv()) << SRS_JFIELD_CONT - << SRS_JFIELD_STR("cwd", _srs_config->cwd()) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("mem_kbyte", r->r.ru_maxrss) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("mem_percent", self_mem_percent) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("cpu_percent", u->percent) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("srs_uptime", srs_uptime) - << SRS_JOBJECT_END << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("system", SRS_JOBJECT_START) - << SRS_JFIELD_ORG("cpu_percent", s->percent) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("disk_read_KBps", d->in_KBps) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("disk_write_KBps", d->out_KBps) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("disk_busy_percent", d->busy) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("mem_ram_kbyte", m->MemTotal) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("mem_ram_percent", m->percent_ram) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("mem_swap_kbyte", m->SwapTotal) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("mem_swap_percent", m->percent_swap) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("cpus", c->nb_processors) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("cpus_online", c->nb_processors_online) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("uptime", p->os_uptime) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("ilde_time", p->os_ilde_time) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("load_1m", p->load_one_minutes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("load_5m", p->load_five_minutes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("load_15m", p->load_fifteen_minutes) << SRS_JFIELD_CONT - // system network bytes stat. - << SRS_JFIELD_ORG("net_sample_time", n_sample_time) << SRS_JFIELD_CONT - // internet public address network device bytes. - << SRS_JFIELD_ORG("net_recv_bytes", nr_bytes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("net_send_bytes", ns_bytes) << SRS_JFIELD_CONT - // intranet private address network device bytes. - << SRS_JFIELD_ORG("net_recvi_bytes", nri_bytes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("net_sendi_bytes", nsi_bytes) << SRS_JFIELD_CONT - // srs network bytes stat. - << SRS_JFIELD_ORG("srs_sample_time", nrs->sample_time) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("srs_recv_bytes", nrs->rbytes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("srs_send_bytes", nrs->sbytes) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("conn_sys", nrs->nb_conn_sys) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("conn_sys_et", nrs->nb_conn_sys_et) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("conn_sys_tw", nrs->nb_conn_sys_tw) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("conn_sys_udp", nrs->nb_conn_sys_udp) << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("conn_srs", nrs->nb_conn_srs) - << SRS_JOBJECT_END - << SRS_JOBJECT_END - << SRS_JOBJECT_END; + SrsAmf0Object* data = SrsAmf0Any::object(); + obj->set("data", data); + + data->set("ok", SrsAmf0Any::boolean(ok)); + data->set("now_ms", SrsAmf0Any::number(now)); + + // self + SrsAmf0Object* self = SrsAmf0Any::object(); + data->set("self", self); + + self->set("version", SrsAmf0Any::str(RTMP_SIG_SRS_VERSION)); + self->set("pid", SrsAmf0Any::number(getpid())); + self->set("ppid", SrsAmf0Any::number(u->ppid)); + self->set("argv", SrsAmf0Any::str(_srs_config->argv().c_str())); + self->set("cwd", SrsAmf0Any::str(_srs_config->cwd().c_str())); + self->set("mem_kbyte", SrsAmf0Any::number(r->r.ru_maxrss)); + self->set("mem_percent", SrsAmf0Any::number(self_mem_percent)); + self->set("cpu_percent", SrsAmf0Any::number(u->percent)); + self->set("srs_uptime", SrsAmf0Any::number(srs_uptime)); + + // system + SrsAmf0Object* sys = SrsAmf0Any::object(); + data->set("system", sys); + + sys->set("cpu_percent", SrsAmf0Any::number(s->percent)); + sys->set("disk_read_KBps", SrsAmf0Any::number(d->in_KBps)); + sys->set("disk_write_KBps", SrsAmf0Any::number(d->out_KBps)); + sys->set("disk_busy_percent", SrsAmf0Any::number(d->busy)); + sys->set("mem_ram_kbyte", SrsAmf0Any::number(m->MemTotal)); + sys->set("mem_ram_percent", SrsAmf0Any::number(m->percent_ram)); + sys->set("mem_swap_kbyte", SrsAmf0Any::number(m->SwapTotal)); + sys->set("mem_swap_percent", SrsAmf0Any::number(m->percent_swap)); + sys->set("cpus", SrsAmf0Any::number(c->nb_processors)); + sys->set("cpus_online", SrsAmf0Any::number(c->nb_processors_online)); + sys->set("uptime", SrsAmf0Any::number(p->os_uptime)); + sys->set("ilde_time", SrsAmf0Any::number(p->os_ilde_time)); + sys->set("load_1m", SrsAmf0Any::number(p->load_one_minutes)); + sys->set("load_5m", SrsAmf0Any::number(p->load_five_minutes)); + sys->set("load_15m", SrsAmf0Any::number(p->load_fifteen_minutes)); + // system network bytes stat. + sys->set("net_sample_time", SrsAmf0Any::number(n_sample_time)); + // internet public address network device bytes. + sys->set("net_recv_bytes", SrsAmf0Any::number(nr_bytes)); + sys->set("net_send_bytes", SrsAmf0Any::number(ns_bytes)); + // intranet private address network device bytes. + sys->set("net_recvi_bytes", SrsAmf0Any::number(nri_bytes)); + sys->set("net_sendi_bytes", SrsAmf0Any::number(nsi_bytes)); + // srs network bytes stat. + sys->set("srs_sample_time", SrsAmf0Any::number(nrs->sample_time)); + sys->set("srs_recv_bytes", SrsAmf0Any::number(nrs->rbytes)); + sys->set("srs_send_bytes", SrsAmf0Any::number(nrs->sbytes)); + sys->set("conn_sys", SrsAmf0Any::number(nrs->nb_conn_sys)); + sys->set("conn_sys_et", SrsAmf0Any::number(nrs->nb_conn_sys_et)); + sys->set("conn_sys_tw", SrsAmf0Any::number(nrs->nb_conn_sys_tw)); + sys->set("conn_sys_udp", SrsAmf0Any::number(nrs->nb_conn_sys_udp)); + sys->set("conn_srs", SrsAmf0Any::number(nrs->nb_conn_srs)); } diff --git a/trunk/src/app/srs_app_utility.hpp b/trunk/src/app/srs_app_utility.hpp index bcf514cef..adf0ae365 100644 --- a/trunk/src/app/srs_app_utility.hpp +++ b/trunk/src/app/srs_app_utility.hpp @@ -41,6 +41,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. class SrsKbps; class SrsStream; +class SrsAmf0Object; // client open socket and connect to server. extern int srs_socket_connect(std::string server, int port, int64_t timeout, st_netfd_t* pstfd); @@ -669,7 +670,7 @@ extern int srs_get_local_port(int fd); extern std::string srs_get_peer_ip(int fd); // dump summaries for /api/v1/summaries. -extern void srs_api_dump_summaries(std::stringstream& ss); +extern void srs_api_dump_summaries(SrsAmf0Object* obj); #endif diff --git a/trunk/src/protocol/srs_protocol_json.hpp b/trunk/src/protocol/srs_protocol_json.hpp index 3b7a8989f..9be221a21 100644 --- a/trunk/src/protocol/srs_protocol_json.hpp +++ b/trunk/src/protocol/srs_protocol_json.hpp @@ -174,56 +174,6 @@ public: //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// -/* json encode - cout<< SRS_JOBJECT_START - << SRS_JFIELD_STR("name", "srs") << SRS_JFIELD_CONT - << SRS_JFIELD_ORG("version", 100) << SRS_JFIELD_CONT - << SRS_JFIELD_NAME("features") << SRS_JOBJECT_START - << SRS_JFIELD_STR("rtmp", "released") << SRS_JFIELD_CONT - << SRS_JFIELD_STR("hls", "released") << SRS_JFIELD_CONT - << SRS_JFIELD_STR("dash", "plan") - << SRS_JOBJECT_END << SRS_JFIELD_CONT - << SRS_JFIELD_STR("author", "srs team") - << SRS_JOBJECT_END -it's: - cont<< "{" - << "name:" << "srs" << "," - << "version:" << 100 << "," - << "features:" << "{" - << "rtmp:" << "released" << "," - << "hls:" << "released" << "," - << "dash:" << "plan" - << "}" << "," - << "author:" << "srs team" - << "}" -that is: - """ - { - "name": "srs", - "version": 100, - "features": { - "rtmp": "released", - "hls": "released", - "dash": "plan" - }, - "author": "srs team" - } - """ -*/ -//////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// -//////////////////////////////////////////////////////////////////////// -#define SRS_JOBJECT_START "{" -#define SRS_JFIELD_NAME(k) "\"" << k << "\":" -#define SRS_JFIELD_OBJ(k) SRS_JFIELD_NAME(k) << SRS_JOBJECT_START -#define SRS_JFIELD_STR(k, v) SRS_JFIELD_NAME(k) << "\"" << v << "\"" -#define SRS_JFIELD_ORG(k, v) SRS_JFIELD_NAME(k) << std::dec << v -#define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false")) -#define SRS_JFIELD_NULL(k) SRS_JFIELD_NAME(k) << "null" -#define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret -#define SRS_JFIELD_CONT "," -#define SRS_JOBJECT_END "}" -#define SRS_JARRAY_START "[" -#define SRS_JARRAY_END "]" +// json encode, please use AMF0.to_json() to encode json object. #endif diff --git a/trunk/src/protocol/srs_rtmp_amf0.cpp b/trunk/src/protocol/srs_rtmp_amf0.cpp index 1f8206f2a..876a489f0 100644 --- a/trunk/src/protocol/srs_rtmp_amf0.cpp +++ b/trunk/src/protocol/srs_rtmp_amf0.cpp @@ -35,6 +35,55 @@ using namespace std; using namespace _srs_internal; +/* json encode + cout<< SRS_JOBJECT_START + << SRS_JFIELD_STR("name", "srs") << SRS_JFIELD_CONT + << SRS_JFIELD_ORG("version", 100) << SRS_JFIELD_CONT + << SRS_JFIELD_NAME("features") << SRS_JOBJECT_START + << SRS_JFIELD_STR("rtmp", "released") << SRS_JFIELD_CONT + << SRS_JFIELD_STR("hls", "released") << SRS_JFIELD_CONT + << SRS_JFIELD_STR("dash", "plan") + << SRS_JOBJECT_END << SRS_JFIELD_CONT + << SRS_JFIELD_STR("author", "srs team") + << SRS_JOBJECT_END + it's: + cont<< "{" + << "name:" << "srs" << "," + << "version:" << 100 << "," + << "features:" << "{" + << "rtmp:" << "released" << "," + << "hls:" << "released" << "," + << "dash:" << "plan" + << "}" << "," + << "author:" << "srs team" + << "}" + that is: + """ + { + "name": "srs", + "version": 100, + "features": { + "rtmp": "released", + "hls": "released", + "dash": "plan" + }, + "author": "srs team" + } + """ + */ +#define SRS_JOBJECT_START "{" +#define SRS_JFIELD_NAME(k) "\"" << k << "\":" +#define SRS_JFIELD_OBJ(k) SRS_JFIELD_NAME(k) << SRS_JOBJECT_START +#define SRS_JFIELD_STR(k, v) SRS_JFIELD_NAME(k) << "\"" << v << "\"" +#define SRS_JFIELD_ORG(k, v) SRS_JFIELD_NAME(k) << std::dec << v +#define SRS_JFIELD_BOOL(k, v) SRS_JFIELD_ORG(k, (v? "true":"false")) +#define SRS_JFIELD_NULL(k) SRS_JFIELD_NAME(k) << "null" +#define SRS_JFIELD_ERROR(ret) "\"" << "code" << "\":" << ret +#define SRS_JFIELD_CONT "," +#define SRS_JOBJECT_END "}" +#define SRS_JARRAY_START "[" +#define SRS_JARRAY_END "]" + // AMF0 marker #define RTMP_AMF0_Number 0x00 #define RTMP_AMF0_Boolean 0x01