diff --git a/server/WebApi.cpp b/server/WebApi.cpp index 49588b60..26ac4401 100755 --- a/server/WebApi.cpp +++ b/server/WebApi.cpp @@ -2344,23 +2344,26 @@ void installWebApi() { CHECK_SECRET(); CHECK_ARGS("timeout_ms"); - auto result = std::make_shared(std::move(val)); - auto complete_token = std::make_shared(nullptr, [result, headerOut, invoker]() { - invoker(200, headerOut, result->toStyledString()); - }); - auto lam_search = [complete_token, result](const std::map &device_info, - const std::string &onvif_url) { - Value obj; - obj["onvif_url"] = onvif_url; - for (auto &pr : device_info) { - obj[pr.first] = pr.second; - } - (*result)["data"].append(std::move(obj)); - //继续等待扫描 - return true; - }; - OnvifSearcher::Instance().sendSearchBroadcast(std::move(lam_search), allArgs["timeout_ms"]); - }); + string subnet_prefix = allArgs["subnet_prefix"]; + + // if (subnet_prefix.empty()) { + // subnet_prefix = "192.168.1"; //default ip prefix + // } + + auto result = std::make_shared(std::move(val)); + auto complete_token = std::make_shared(nullptr, [result, headerOut, invoker]() { invoker(200, headerOut, result->toStyledString()); }); + auto lam_search = [complete_token, result](const std::map &device_info, const std::string &onvif_url) { + Value obj; + obj["onvif_url"] = onvif_url; + for (auto &pr : device_info) { + obj[pr.first] = pr.second; + } + (*result)["data"].append(std::move(obj)); + //继续等待扫描 + return true; + }; + OnvifSearcher::Instance().sendSearchBroadcast(move(subnet_prefix), std::move(lam_search), allArgs["timeout_ms"]); + }); api_regist("/index/api/getStreamUrl", [](API_ARGS_MAP_ASYNC) { CHECK_SECRET(); diff --git a/src/Onvif/Onvif.cpp b/src/Onvif/Onvif.cpp index 3e88abf3..35f49d6a 100644 --- a/src/Onvif/Onvif.cpp +++ b/src/Onvif/Onvif.cpp @@ -54,17 +54,17 @@ OnvifSearcher::OnvifSearcher() { _poller = EventPollerPool::Instance().getPoller(); } -void OnvifSearcher::sendSearchBroadcast(onDevice cb, uint64_t timeout_ms) { +void OnvifSearcher::sendSearchBroadcast(std::string subnet_prefix, onDevice cb, uint64_t timeout_ms) { weak_ptr weak_self = shared_from_this(); - _poller->async([weak_self, cb, timeout_ms]() mutable { + _poller->async([weak_self, cb, timeout_ms, subnet_prefix]() mutable { auto strong_self = weak_self.lock(); if (strong_self) { - strong_self->sendSearchBroadcast_l(std::move(cb), timeout_ms); + strong_self->sendSearchBroadcast_l(move(subnet_prefix), std::move(cb), timeout_ms); } }); } -void OnvifSearcher::sendSearchBroadcast_l(onDevice cb, uint64_t timeout_ms) { +void OnvifSearcher::sendSearchBroadcast_l(const std::string &subnet_prefix, onDevice cb, uint64_t timeout_ms) { static struct sockaddr_in s_search_address; static onceToken s_token([]() { s_search_address.sin_family = AF_INET; @@ -113,9 +113,20 @@ void OnvifSearcher::sendSearchBroadcast_l(onDevice cb, uint64_t timeout_ms) { auto &ref = _cb_map[uuid]; ref.cb = std::move(cb); ref.timeout_ms = timeout_ms; + std::string ip; + struct sockaddr_in target {}; for (auto &sock : _sock_list) { - sock->send(xml, (struct sockaddr *) &s_search_address, sizeof(s_search_address)); + sock->send(xml, (struct sockaddr *)&s_search_address, sizeof(s_search_address)); + if (!subnet_prefix.empty()) { + for (int i = 1; i <= 254; ++i) { + ip = subnet_prefix + "." + std::to_string(i); + target.sin_family = AF_INET; + target.sin_port = htons(3702); + inet_pton(AF_INET, ip.c_str(), &target.sin_addr); + sock->send(xml, (struct sockaddr *)&target, sizeof(target)); + } + } } } diff --git a/src/Onvif/Onvif.h b/src/Onvif/Onvif.h index 0aa575d0..4e77a694 100644 --- a/src/Onvif/Onvif.h +++ b/src/Onvif/Onvif.h @@ -23,12 +23,12 @@ public: OnvifSearcher(); static OnvifSearcher &Instance(); - void sendSearchBroadcast(onDevice cb = nullptr, uint64_t timeout_ms = 10 * 1000); + void sendSearchBroadcast(std::string subnet_prefix, onDevice cb = nullptr, uint64_t timeout_ms = 10 * 1000); private: void onDeviceResponse(const toolkit::Buffer::Ptr &buf, struct sockaddr *addr, int addr_len); void onGotDevice(const std::string &uuid, std::map &device_info, const std::string &onvif_url); - void sendSearchBroadcast_l(onDevice cb, uint64_t timeout_ms); + void sendSearchBroadcast_l(const std::string &subnet_prefix, onDevice cb, uint64_t timeout_ms); private: struct onDeviceCB{