93 lines
2.6 KiB
C++
93 lines
2.6 KiB
C++
#pragma once
|
|
|
|
#include "action_base.h"
|
|
|
|
#include <chrono>
|
|
#include <atomic>
|
|
#include <condition_variable>
|
|
#include <mutex>
|
|
#include <queue>
|
|
#include <string>
|
|
#include <thread>
|
|
|
|
namespace rk3588 {
|
|
|
|
std::string BuildExternalApiResultLogLine(const std::string& prefix,
|
|
const std::string& event_id,
|
|
const std::string& alarm_content,
|
|
const std::string& pic_url,
|
|
const std::string& video_url,
|
|
long http_code,
|
|
const std::string& err);
|
|
|
|
class ExternalApiAction : public IAlarmAction {
|
|
public:
|
|
~ExternalApiAction() override;
|
|
|
|
bool Init(const SimpleJson& config) override;
|
|
void Execute(AlarmEvent& event, std::shared_ptr<Frame> frame) override;
|
|
void Drain() override;
|
|
void Stop() override;
|
|
std::string Name() const override { return "external_api"; }
|
|
|
|
private:
|
|
struct Job {
|
|
std::string tenant_code;
|
|
std::string channel_no;
|
|
std::string event_id;
|
|
std::string alarm_content;
|
|
uint64_t timestamp_ms = 0;
|
|
std::string pic_url;
|
|
std::string video_url;
|
|
};
|
|
|
|
enum class QueuePolicy {
|
|
DropOldest,
|
|
DropNewest,
|
|
};
|
|
|
|
void WorkerLoop();
|
|
bool EnsureToken(std::string& err);
|
|
bool FetchToken(std::string& token_out, std::string& err);
|
|
bool SendMessageWithToken(const Job& job, const std::string& token, long& http_code, std::string& err);
|
|
|
|
std::string BuildMessageJson(const Job& job) const;
|
|
std::string FormatAlarmTime(uint64_t timestamp_ms) const;
|
|
|
|
std::string get_token_url_;
|
|
std::string put_message_url_;
|
|
|
|
std::string tenant_code_;
|
|
std::string channel_no_;
|
|
|
|
std::string alarm_content_;
|
|
bool use_rule_name_as_content_ = true;
|
|
|
|
bool include_media_url_ = true;
|
|
int timeout_ms_ = 3000;
|
|
|
|
std::string token_header_ = "X-Access-Token";
|
|
std::string token_json_path_ = "responseBody.token";
|
|
int token_cache_sec_ = 600;
|
|
|
|
int max_retries_ = 0;
|
|
int retry_backoff_ms_ = 200;
|
|
|
|
std::atomic<bool> running_{false};
|
|
std::thread worker_;
|
|
std::mutex queue_mutex_;
|
|
std::condition_variable queue_cv_;
|
|
std::queue<Job> queue_;
|
|
size_t in_flight_ = 0;
|
|
|
|
size_t max_queue_size_ = 0; // 0 = unlimited
|
|
QueuePolicy queue_policy_ = QueuePolicy::DropOldest;
|
|
uint64_t dropped_total_ = 0;
|
|
|
|
std::mutex token_mu_;
|
|
std::string token_;
|
|
std::chrono::steady_clock::time_point token_expire_tp_{};
|
|
};
|
|
|
|
} // namespace rk3588
|