mirror of
https://gitee.com/xia-chu/ZLMediaKit.git
synced 2026-05-10 12:37:48 +08:00
Add optional subnet_prefix parameter to searchOnvifDevice interface
This commit is contained in:
parent
6d520ea6a3
commit
8ca4b4d92a
@ -2344,23 +2344,26 @@ void installWebApi() {
|
|||||||
CHECK_SECRET();
|
CHECK_SECRET();
|
||||||
CHECK_ARGS("timeout_ms");
|
CHECK_ARGS("timeout_ms");
|
||||||
|
|
||||||
auto result = std::make_shared<Value>(std::move(val));
|
string subnet_prefix = allArgs["subnet_prefix"];
|
||||||
auto complete_token = std::make_shared<onceToken>(nullptr, [result, headerOut, invoker]() {
|
|
||||||
invoker(200, headerOut, result->toStyledString());
|
// if (subnet_prefix.empty()) {
|
||||||
});
|
// subnet_prefix = "192.168.1"; //default ip prefix
|
||||||
auto lam_search = [complete_token, result](const std::map<string, string> &device_info,
|
// }
|
||||||
const std::string &onvif_url) {
|
|
||||||
Value obj;
|
auto result = std::make_shared<Value>(std::move(val));
|
||||||
obj["onvif_url"] = onvif_url;
|
auto complete_token = std::make_shared<onceToken>(nullptr, [result, headerOut, invoker]() { invoker(200, headerOut, result->toStyledString()); });
|
||||||
for (auto &pr : device_info) {
|
auto lam_search = [complete_token, result](const std::map<string, string> &device_info, const std::string &onvif_url) {
|
||||||
obj[pr.first] = pr.second;
|
Value obj;
|
||||||
}
|
obj["onvif_url"] = onvif_url;
|
||||||
(*result)["data"].append(std::move(obj));
|
for (auto &pr : device_info) {
|
||||||
//继续等待扫描
|
obj[pr.first] = pr.second;
|
||||||
return true;
|
}
|
||||||
};
|
(*result)["data"].append(std::move(obj));
|
||||||
OnvifSearcher::Instance().sendSearchBroadcast(std::move(lam_search), allArgs["timeout_ms"]);
|
//继续等待扫描
|
||||||
});
|
return true;
|
||||||
|
};
|
||||||
|
OnvifSearcher::Instance().sendSearchBroadcast(move(subnet_prefix), std::move(lam_search), allArgs["timeout_ms"]);
|
||||||
|
});
|
||||||
|
|
||||||
api_regist("/index/api/getStreamUrl", [](API_ARGS_MAP_ASYNC) {
|
api_regist("/index/api/getStreamUrl", [](API_ARGS_MAP_ASYNC) {
|
||||||
CHECK_SECRET();
|
CHECK_SECRET();
|
||||||
|
|||||||
@ -54,17 +54,17 @@ OnvifSearcher::OnvifSearcher() {
|
|||||||
_poller = EventPollerPool::Instance().getPoller();
|
_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<OnvifSearcher> weak_self = shared_from_this();
|
weak_ptr<OnvifSearcher> 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();
|
auto strong_self = weak_self.lock();
|
||||||
if (strong_self) {
|
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 struct sockaddr_in s_search_address;
|
||||||
static onceToken s_token([]() {
|
static onceToken s_token([]() {
|
||||||
s_search_address.sin_family = AF_INET;
|
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];
|
auto &ref = _cb_map[uuid];
|
||||||
ref.cb = std::move(cb);
|
ref.cb = std::move(cb);
|
||||||
ref.timeout_ms = timeout_ms;
|
ref.timeout_ms = timeout_ms;
|
||||||
|
std::string ip;
|
||||||
|
struct sockaddr_in target {};
|
||||||
|
|
||||||
for (auto &sock : _sock_list) {
|
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));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -23,12 +23,12 @@ public:
|
|||||||
OnvifSearcher();
|
OnvifSearcher();
|
||||||
|
|
||||||
static OnvifSearcher &Instance();
|
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:
|
private:
|
||||||
void onDeviceResponse(const toolkit::Buffer::Ptr &buf, struct sockaddr *addr, int addr_len);
|
void onDeviceResponse(const toolkit::Buffer::Ptr &buf, struct sockaddr *addr, int addr_len);
|
||||||
void onGotDevice(const std::string &uuid, std::map<std::string, std::string> &device_info, const std::string &onvif_url);
|
void onGotDevice(const std::string &uuid, std::map<std::string, std::string> &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:
|
private:
|
||||||
struct onDeviceCB{
|
struct onDeviceCB{
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user