Compare commits

..

No commits in common. "22dede5a18638eb115bc97f8e7d4814a6c4837ad" and "6d520ea6a363e404c9e6bbd49f6765da1d736688" have entirely different histories.

4 changed files with 24 additions and 96 deletions

View File

@ -2892,64 +2892,6 @@
} }
}, },
"response": [] "response": []
},
{
"name": "onvif 搜索",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{ZLMediaKit_URL}}/index/api/searchOnvifDevice?secret={{ZLMediaKit_secret}}&timeout_ms=5000",
"host": [
"{{ZLMediaKit_URL}}"
],
"path": [
"index",
"api",
"searchOnvifDevice"
],
"query": [
{
"key": "secret",
"value": "{{ZLMediaKit_secret}}"
},
{
"key": "subnet_prefix",
"value": "192.168.1"
}
]
}
},
"response": []
},
{
"name": "获取 onvif 设备url",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{ZLMediaKit_URL}}/index/api/getStreamUrl?secret={{ZLMediaKit_secret}}&onvif_url=http://xxxx/onvif/device_service",
"host": [
"{{ZLMediaKit_URL}}"
],
"path": [
"index",
"api",
"getStreamUrl"
],
"query": [
{
"key": "secret",
"value": "{{ZLMediaKit_secret}}"
},
{
"key": "onvif_url",
"value": "http://xxxx/onvif/device_service"
}
]
}
},
"response": []
} }
], ],
"event": [ "event": [

View File

@ -2344,26 +2344,23 @@ void installWebApi() {
CHECK_SECRET(); CHECK_SECRET();
CHECK_ARGS("timeout_ms"); CHECK_ARGS("timeout_ms");
string subnet_prefix = allArgs["subnet_prefix"]; auto result = std::make_shared<Value>(std::move(val));
auto complete_token = std::make_shared<onceToken>(nullptr, [result, headerOut, invoker]() {
// if (subnet_prefix.empty()) { invoker(200, headerOut, result->toStyledString());
// 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) {
auto result = std::make_shared<Value>(std::move(val)); Value obj;
auto complete_token = std::make_shared<onceToken>(nullptr, [result, headerOut, invoker]() { invoker(200, headerOut, result->toStyledString()); }); obj["onvif_url"] = onvif_url;
auto lam_search = [complete_token, result](const std::map<string, string> &device_info, const std::string &onvif_url) { for (auto &pr : device_info) {
Value obj; obj[pr.first] = pr.second;
obj["onvif_url"] = onvif_url; }
for (auto &pr : device_info) { (*result)["data"].append(std::move(obj));
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();

View File

@ -54,17 +54,17 @@ OnvifSearcher::OnvifSearcher() {
_poller = EventPollerPool::Instance().getPoller(); _poller = EventPollerPool::Instance().getPoller();
} }
void OnvifSearcher::sendSearchBroadcast(std::string subnet_prefix, onDevice cb, uint64_t timeout_ms) { void OnvifSearcher::sendSearchBroadcast(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, subnet_prefix]() mutable { _poller->async([weak_self, cb, timeout_ms]() mutable {
auto strong_self = weak_self.lock(); auto strong_self = weak_self.lock();
if (strong_self) { if (strong_self) {
strong_self->sendSearchBroadcast_l(move(subnet_prefix), std::move(cb), timeout_ms); strong_self->sendSearchBroadcast_l(std::move(cb), timeout_ms);
} }
}); });
} }
void OnvifSearcher::sendSearchBroadcast_l(const std::string &subnet_prefix, onDevice cb, uint64_t timeout_ms) { void OnvifSearcher::sendSearchBroadcast_l(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,20 +113,9 @@ void OnvifSearcher::sendSearchBroadcast_l(const std::string &subnet_prefix, onDe
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));
}
}
} }
} }

View File

@ -23,12 +23,12 @@ public:
OnvifSearcher(); OnvifSearcher();
static OnvifSearcher &Instance(); static OnvifSearcher &Instance();
void sendSearchBroadcast(std::string subnet_prefix, onDevice cb = nullptr, uint64_t timeout_ms = 10 * 1000); void sendSearchBroadcast(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(const std::string &subnet_prefix, onDevice cb, uint64_t timeout_ms); void sendSearchBroadcast_l(onDevice cb, uint64_t timeout_ms);
private: private:
struct onDeviceCB{ struct onDeviceCB{